这是我在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的实例。
答案 0 :(得分:2)
在你的控制器中,你可以这样做:
@posts = Post.all
@productos_category = @categories.where(name: "Productos").first
@productos = @posts.where(category_id: @productos_category.id)
请注意,我更改了您找到关联@productos
以使用ActiveRecord查询界面的方式,而不是使用纯ruby select
和include?
方法。这将使查询更有效。我隐含了一些内容,例如类别的子键为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>