2011-05-30 55 views
2

我有一个模型叫网站has_many :likes,当然还有另一种模式叫喜欢跟belongs_to :website。我想获得所有网站的数组,但按网站的喜好数量排列。(导轨)订购喜欢的号码在网站

有用的信息:

我有它设置,使@website.likes将从@website返回喜欢。 (@website.likes.count是喜欢一个网站的数量)

我想获得所有网站的数组,但订购他们的网站数量喜欢。沿线的

+0

'sort'不通过SQL IIRC – alternative 2011-05-30 22:43:34

+2

做,如果网站在@popularwebsites数低,这可能是可以接受的。但是,如果您先将所有网站放入该阵列中,然后进行实时排序,则该方法将变得昂贵和快速。另外,由于x.likes.count必须进行数据库查询,因此会遇到称为N + 1查询问题的问题。 – randomguy 2011-05-30 22:44:09

回答

5

正如其他人发布的,你可以做一个加入到likes然后顺序由伯爵。性能可能会有点iffy取决于索引等你会有稍微不同的语法取决于你是否运行Rails 2或3。

另一种方法是维护likes_countwebsites这是更新时一个Like模型对象被保存。

然后,你只需要在Website上查询,并指定一个订单likes_count降序(并很容易索引)。

要做到这一点,创建了一个websites整数likes_count列,并指定在Likes模型belongs_to声明:counter_cache选项。 e.g:

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

退房http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html更多信息

+0

快速而简单!谢谢! (我把它所有的人响应工作呢!) – 2011-05-30 23:38:58

+0

酷解决方案!这方面的缺点是,比如说,如果你从数据库控制台中删除了一个,那么删除将不会反映在likes_count上。在这种情况下不是出价交易,而是要注意的事情。 – randomguy 2011-05-31 13:32:08

+0

对。谢谢你的建议 – 2011-06-01 03:43:49

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 
2

该查询应该给你你需要的东西:

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

谢谢!它运作良好! – 2011-06-01 03:42:45

+0

由于内部连接从结果集中去除了所有没有喜欢的网站,它不会返回没有任何喜欢的网站。 – sled 2014-05-23 02:34:18