2016-04-29 4 views
1

私は、ビュー内でデータベースにpingを実行すべきではないと思っていますが、適切な解決策については不思議です。私の見解の1つでは、@orderの子であるitemsAmountという別のモデルの情報を引き出す必要があります。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ハッシュ)を一緒に入れて、かなりファンキーだろう

+0

'{}'は 'Hash.new'と同じくらいよく、もっと簡潔です。 – tadman

+0

商品、払い戻し額、金額の関連はどうですか? 1対1、1対多数?アイテムhas_one:払い戻しですか?あなたの質問はアイテムが潜在的に多くの払い戻しを持っていることを示していますが、これがあなたの意図であるかどうかです。 – jverban

答えて

5

まずあなたが

item.refund 
item.amount 

代わりのRefund.where(...)を行うことができるように、私は、アイテムおよび2つの他のクラス間の関連を使用するの。あなたはさらに、このような

def refund_amount 
    refund.amount 
end 

として、同様に他のいずれかの方法を(定義し、うまくいけばamount_amountより良い名前を思い付く。

これはあなたのビューとコントローラクリーンの両方を保持しますが、それはできませんでしたこれまでのところ、すべてのアプローチでは、項目あたり2つのデータベースクエリを実行することが関係していましたが、これは実際の問題です。過剰クエリがビュー内で発生するかコントローラが問題になるかどうかは関係ありません。アクティブレコードのインクルードメカニズムでこれを避けることができます:

Item.include(:amount,:refund).where("your conditions here") 

名前付きアソシエーションは、各アイテムがアクセスされるたびに1つずつロードされるのではなく、一括してロードされます。

+0

はい申し訳ありませんが、私は夜遅くこの質問をしましたので、愚かなので、協会が設置されていますので、私は 'item.refund'を行うだけです。私はあなたが言っていることを見ています。「インクルード」を使用していることを思い出してくれてありがとう。私は、唯一のアプローチは、ありがとう! – james

関連する問題