我有兩個型號,與協會:如何在Rails循環中通過查詢優化has_many?
class Product < ActiveRecord::Base
has_many :side_orders
has_many :garnishes, :through => :side_orders
attr_accessible :garnishes_number
end
配菜也是產品,所以這是一個自加入協會:
class SideOrder < ActiveRecord::Base
belongs_to :product
belongs_to :garnish, :class_name => "Product", :foreign_key => "garnish_id"
attr_accessible :list_number
end
一個產品可能有裝飾物的許多列表(讓客戶當他們訂購一種產品時可以選擇不同的裝飾品)。這是每個選擇的一個列表。一種產品沒有超過「garnishes_number」選項列表。
在我的應用程序,在管理的一部分,我必須做這樣的事情:
<% Product.all.each do |product| %>
<% for i in 0..(product.garnishes_number - 1) %>
Lists of garnishes:
<%= product.garnishes.where("side_orders.list_number = ?", i) %> <br />
<% end %>
<% end %>
這只是一個例子......問題是,Rails的做每一個價值查詢「我」,所以如果一個產品有8個列表,Rails將對數據庫執行8個查詢......當有超過數百個產品時,它變得非常慢...
有沒有一種方法來優化這樣的查詢?包含內容似乎不起作用......如果任何人有任何想法或者不同的邏輯,請不要猶豫回答。
[編輯],我想訪問配菜的每個列表的事實是重要的,因爲我希望他們能夠出現在這樣的方式表:
<table>
<thead>
<td>Product</td>
<td>List of garnishes </td>
</thead>
<tbody>
<% Product.all.each do |product| %>
<% for i in 0..(product.garnishes_number - 1) %>
<tr>
<td>product.name</td>
<td>
List number <%= i %>:
<%= product.garnishes.where("side_orders.list_number = ?", i) %>
</td>
</tr>
<% end %>
<% end %>
</tbody>
</table>
我沒有提出,在第一,因爲我不希望我的問題太長...但是,我想我應該已經寫下來,以便我的問題可以更容易理解......對不起^^'
謝謝很多! Kulgar。
看起來不錯,但我想在每個裝飾列表之間做一個
......好吧,我放了一個br,這樣我的例子不是很大,但實際上它是在一個表中,每行顯示一個配飾每個產品的列表。我會更新我的答案,以便您更好地瞭解我的意思。 – Kulgar
您可以稍後手動執行,因爲對數據庫的查詢不存在 –
您是什麼意思?例如,你可以舉一個例子,我怎樣才能從查詢中得到第一個裝飾清單?非常感謝! :) – Kulgar