1

我有兩個型號,與協會:如何在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。

回答

3

您可以通過以下方式

<% Product.all.each do |product| %> 
<% temp = Array.new %> 
<% for i in 0..(product.garnishes_number - 1) %> 
    <% temp.push(i) %> 
<%end%> 
    Lists of garnishes: 
    <%= product.garnishes.where("side_orders.list_number in(?)", temp) %> <br /> 
<% end %> 

這將調用這裏查詢只一次爲每個產品

+0

看起來不錯,但我想在每個裝飾列表之間做一個
......好吧,我放了一個br,這樣我的例子不是很大,但實際上它是在一個表中,每行顯示一個配飾每個產品的列表。我會更新我的答案,以便您更好地瞭解我的意思。 – Kulgar

+0

您可以稍後手動執行,因爲對數據庫的查詢不存在 –

+0

您是什麼意思?例如,你可以舉一個例子,我怎樣才能從查詢中得到第一個裝飾清單?非常感謝! :) – Kulgar