我有一个名为has_many :likes
的网站模型,当然还有另一个名为belongs_to :website
的模型。我想获得所有网站的数组,但是按照网站的数量来订购它们。
有用的信息:
我已将其设置为@website.likes
将从@website
返回喜欢的内容。 (@website.likes.count
是网站喜欢的数量)
我希望获得所有网站的数组,但是按照网站的数量排序。
答案 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