has_many通过包括

时间:2016-05-26 14:06:07

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4

这是我用来查询的两个模型:

模型1

 has_many :locks_order_items, dependent: :destroy
 has_many :locks, through: :locks_order_items

模型2

 belongs_to :order_item
 belongs_to :lock

表格

<%= f.fields_for :order_items, @order_items do |f1| %>
   <% f1.object.locks_order_items.order("locks_order_items.check
   DESC, locks_order_items.id ASC").each do |m| 
      <li> <%= m.lock.name %> </li>
      <input type='hidden' name='order[order_items_attributes][<%= row_count
      %>][locks_order_items_attributes][][lock_id]' value='<%= m.lock_id %>'
      />
   end %>
<% end %>

当表单加载时,这是运行的查询:

SELECT "locks_order_items".* FROM "locks_order_items" WHERE 
"locks_order_items"."order_item_id" = 4444 ORDER BY 
locks_order_items.check DESC, locks_order_items.id ASC

如果模型2中有10个条目,则上述查询将运行10次。我试图添加包含,但它仍然像那样运行。

有没有办法在包含?

的一个查询中运行它

1 个答案:

答案 0 :(得分:0)

在控制器中选择,过滤和订购模型,而不是在视图中。您的观点应该只显示给出的内容。

因此,在控制器中订购模型并使用includes()解析N+1次查询:

@results = YourModel.includes(:locks_order_items).where({your: :query}).
               order("locks_order_items.check DESC, locks_order_items.id ASC")

在您的视图中,只渲染您的收藏。