1

我有两个模型,具有这些关联:

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对每个“i”值进行一次查询,所以如果一个产品有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>

我没有把它放在首位,因为我不希望我的问题太长......但是,我想我应该已经把它写下来以便我的问题可以更容易理解......对不起^ ^'

非常感谢!库尔加。

4

1 回答 1

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 %>

这将为每个产品调用一次 where 查询

于 2013-01-22T09:26:54.863 回答