私は、ビュー内でデータベースにpingを実行すべきではないと思っていますが、適切な解決策については不思議です。私の見解の1つでは、@order
の子であるitems
とAmount
という別のモデルの情報を引き出す必要があります。item
です。このような何か:ビューにデータベースを置かないようにするには
<% @order.items.each do |item| %>
<td><%= item.name %></td>
<td><%= Refund.where(item_id:item.id).first.amount %></td>
<td><%= Amount.where(item_id: item.id).first.amount %></td>
<% end %>
ビューでDBのヒットを回避さのためには、私が考えてきた唯一の解決策は、アクセスされたコントローラ内のすべての関連データの巨大なハッシュを作成することですビューから。最善の解決策ということです...
# controller (writing quickly, code may not be totally right, hopefully you get gist
data = Hash.new
data["items"] = []
@order.items.each do |item|
item_hash = {
"name" => item.name,
"amount" => Amount.where(item_id: item.id).first.amount,
"refund" => Refund.where(item_id:item.id).first.amount
}
data["items"] << item_hash
end
# view code
<% data["items"].each do |item| %>
<td><%= item["name"] %></td>
<td><%= item["refund"] %></td>
<td><%= item["amount"] %></td>
<% end %>
そして私はSOの質問のこのタイプ嫌って知っている...しかし、私は本当に知っておく必要があります。だから、このようなものになるだろうか?またはベストプラクティスがありますか?私が尋ねる理由は、ビューで非常にきれいに見えますが、コントローラでは非常にかさばっているためです。さらに複雑なネストしたテーブルを持っていると、扱いにくくなります。つまり、実際には(つまりdata
ハッシュ)を一緒に入れて、かなりファンキーだろう
'{}'は 'Hash.new'と同じくらいよく、もっと簡潔です。 – tadman
商品、払い戻し額、金額の関連はどうですか? 1対1、1対多数?アイテムhas_one:払い戻しですか?あなたの質問はアイテムが潜在的に多くの払い戻しを持っていることを示していますが、これがあなたの意図であるかどうかです。 – jverban