2014-09-24 78 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