2014-09-24 82 views
0

这是在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> 

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

例如我想做一些像每个做| post |在第一节中做一些事情,在第二节中不要做任何事情,并在第三节中继续。这样我就可以重新使用我正在迭代的选定postd的实例。

+3

你想要做的第一件事是移动该查询到控制器。该视图适用于模板代码,不适用于查询。 – zwippie 2014-09-24 14:26:39

回答

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> 
+0

感谢您的回复!问题是,邮政和类别模型有一个多对多的分化...所以我需要看看category_ids – tomascharad 2014-09-24 14:51:40

+1

这是一个很好的建议,但它不回答这个问题。他想现在(说明他将如何获得它)他如何只能循环一次,并且有'list_carousel'和'modals' div填充这个单循环。 – lcguida 2014-09-24 14:55:05

+1

我不相信这是真的。我相信他只是为了表现的目的而以这种方式表达了这个问题。一旦查询得到修复,他目前正在进行的工作方式可以正常工作。 – Eugene 2014-09-24 15:12:23