2014-01-14 80 views
1

我有兩個數據庫表,一個叫做「食譜」,另一個叫「喜歡」。Rails「order_by」關聯表

當我在我的網站上列出我的食譜時,我可以通過配方表中的一列輕鬆訂購它們。例如通過之日起,他們將創建在:

<% @recipes.order("created_at desc").limit(16).each do |i| %> 
    <% if i.live? %> 
    <%=link_to image_tag(i.image(:fixed), :class => "newest-recipes"), i %> 
    <% end %> 
<% end %> 

我真正想要做的是通過他們喜歡的數量進行排序。

<%= @recipe.likers.count %> 

是否存在被@ recipe.likers.count訂購食譜的方法:要我用這段代碼的食譜頁面上顯示操作次數的多少?

如果您需要其他信息,如配方控制器或型號,請讓我知道。

謝謝!

回答

1

你應該看看http://guides.rubyonrails.org/association_basics.html#counter-cache

基本上,一個新的整數列添加到recipes表稱爲likes_count,然後編輯Like模型的樣子:

class Like < ActiveRecord::Base 
    belongs_to :recipe, counter_cache: true 
end 

那麼Rails會自動更新它在必要時,您可以按該列順序排列:

@recipes.order(:likes_count) 
+0

感謝您的幫助!我試試看,並接受,如果它運作出來:) – MikeHolford

+0

添加後,請記住保存所有食譜與'Recipe.all.each(:保存)';) –

0

我會爲@劉六回答(+1)。但是,如果您不能將新列添加到現有的表,你可以在你的Recipe模型創建範圍:

class Recipe < ActiveRecord::Base 
    has_many :likes 
    scope :likes_count, 
    select("recipes.id, ANY_OTHER_COLUMN_YOU_NEED_HERE, count(likes.id) AS likes_count"). 
    joins(:likes). 
    group("recipes.id"). 
    order("likes_count DESC") 
end 

@recipes = Recipe.likes_count 
+0

謝謝你的幫助生病了看看兩種選擇 – MikeHolford