(rails)按网站上的喜欢次数排序

时间:2011-05-30 22:31:44

标签: ruby-on-rails views models

我有一个名为has_many :likes的网站模型,当然还有另一个名为belongs_to :website的模型。我想获得所有网站的数组,但是按照网站的数量来订购它们。

有用的信息:

我已将其设置为@website.likes将从@website返回喜欢的内容。 (@website.likes.count是网站喜欢的数量)

  

我希望获得所有网站的数组,但是按照网站的数量排序。

3 个答案:

答案 0 :(得分:5)

正如其他人发布的那样,您可以加入likes,然后按计数排序。性能可能有点不确定,具体取决于索引等。根据您是否运行Rails 2或3,您的语法会略有不同。

另一种方法是在likes_count上维护一个非规范化的websites列,该列在保存Like模型对象时会更新。

然后,您只需要查询Website并指定订单likes_count降序(并且很容易编入索引)。

为此,请在likes_count上创建websites整数列,并在:counter_cache模型中的belongs_to声明中指定Likes选项。 e.g:

class Likes
  belongs_to :website, :counter_cache => true
end

查看http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html了解详情

答案 1 :(得分:2)

此查询应该为您提供所需内容:

all(:select => 'websites.*, count(*) as count',
  :joins => :likes,
  :group => :websites,
  :order => 'count DESC')

答案 2 :(得分:0)

有些事情:

SELECT Websites.*, COUNT(Like.ID) AS Liked
FROM websites
    LEFT OUTER JOIN Like ON websites.ID = Like.website_id
GROUP BY Like.website_id ORDER BY Liked DESC