1

これらの関連付けを持つ 2 つのモデルがあります。

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

1 つの製品に多数の付け合わせのリストが含まれる場合があります (お客様が 1 つの製品を注文するときに、異なる付け合わせを選択できるようにするため)。選択肢ごとに 1 つのリストです。1 つの商品の選択肢リストが「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」の値ごとに1つのクエリを実行することです。したがって、製品に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 %>

これにより、製品ごとに 1 回だけ where クエリが呼び出されます

于 2013-01-22T09:26:54.863 に答える