在不同部分的html.erb文件中划分循环迭代以提高性能

时间:2014-09-24 14:15:35

标签: ruby ruby-on-rails-4

这是我在html.erb文件中的代码的一部分

<div class="list_carousel">
  <ul id="products-carousel" class="carousel">
    <% @posts.select{ |post| post.categories.include?(@categories.find_by_name("Productos")) }.each do |post|%>
      [...]
    <% end %>
  </ul>
</div>
[...]
<div class="modals">
  <% @posts.select{ |post| post.categories.include?(@categories.find_by_name("Productos")) }.each do |post|%>
    [...]
  <% end %>
</div>

这里的问题是我使用了几个数据库查询来执行这个循环,我想在这个文件的其他部分重用第一个循环,以提高性能。

例如,我想做每个人做的事情|发布|在第一部分做一些事情,不要在第二部分做任何事情,继续第三部分。这样我就可以重复使用我正在迭代的所选postd的实例。

1 个答案:

答案 0 :(得分:2)

在你的控制器中,你可以这样做:

@posts              = Post.all
@productos_category = @categories.where(name: "Productos").first
@productos          = @posts.where(category_id: @productos_category.id)

请注意,我更改了您找到关联@productos以使用ActiveRecord查询界面的方式,而不是使用纯ruby selectinclude?方法。这将使查询更有效。我隐含了一些内容,例如类别的子键为category_id。在适当的地方更改。

编辑1

我相信这会有效,尽管我对多对多关系的体验有限:

@productos_category = @categories.where(name: "Productos").first
@productos_posts    = Post.joins(:join_table).where(join_table: {category_id: @productos_category.id})

其中:join_table是has_many关联中使用的表的名称。如果它是HABTM关系,则可能会将其称为categories_posts

那么您的观点将改为:

<div class="list_carousel">
  <ul id="products-carousel" class="carousel">
    <% @productos_posts.each do |post|%>
      [...]
    <% end %>
  </ul>
</div>
[...]
<div class="modals">
  <% @productos_posts.each do |post|%>
    [...]
  <% end %>
</div>