Rails“order_by”一个关联的表

时间:2014-01-14 13:42:05

标签: ruby-on-rails count sql-order-by

我有两个数据库表,一个叫做“Recipes”,另一个叫“Likes”。

当我在我的网站上列出我的食谱时,我可以轻松地通过食谱表中的一列来订购它们。例如,在以下日期创建它们:

<% @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订购食谱?

如果您需要其他信息,如配方控制器或型号,请告知我们。

谢谢!

2 个答案:

答案 0 :(得分:1)

你应该看看http://guides.rubyonrails.org/association_basics.html#counter-cache

基本上,在名为recipes的{​​{1}}表中添加一个新的整数列,然后编辑likes_count模型,如下所示:

Like

然后Rails会在必要时自动更新它,您只需按该列排序:

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

答案 1 :(得分:0)

我会去@Ju Liu回答(+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