我有一个模型叫网站has_many :likes
,当然还有另一种模式叫喜欢跟belongs_to :website
。我想获得所有网站的数组,但按网站的喜好数量排列。(导轨)订购喜欢的号码在网站
有用的信息:
我有它设置,使@website.likes
将从@website
返回喜欢。 (@website.likes.count
是喜欢一个网站的数量)
我想获得所有网站的数组,但订购他们的网站数量喜欢。沿线的
我有一个模型叫网站has_many :likes
,当然还有另一种模式叫喜欢跟belongs_to :website
。我想获得所有网站的数组,但按网站的喜好数量排列。(导轨)订购喜欢的号码在网站
有用的信息:
我有它设置,使@website.likes
将从@website
返回喜欢。 (@website.likes.count
是喜欢一个网站的数量)
我想获得所有网站的数组,但订购他们的网站数量喜欢。沿线的
正如其他人发布的,你可以做一个加入到likes
然后顺序由伯爵。性能可能会有点iffy取决于索引等你会有稍微不同的语法取决于你是否运行Rails 2或3。
另一种方法是维护likes_count
列websites
这是更新时一个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更多信息
快速而简单!谢谢! (我把它所有的人响应工作呢!) – 2011-05-30 23:38:58
酷解决方案!这方面的缺点是,比如说,如果你从数据库控制台中删除了一个,那么删除将不会反映在likes_count上。在这种情况下不是出价交易,而是要注意的事情。 – randomguy 2011-05-31 13:32:08
对。谢谢你的建议 – 2011-06-01 03:43:49
东西:
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
该查询应该给你你需要的东西:
all(:select => 'websites.*, count(*) as count',
:joins => :likes,
:group => :websites,
:order => 'count DESC')
谢谢!它运作良好! – 2011-06-01 03:42:45
由于内部连接从结果集中去除了所有没有喜欢的网站,它不会返回没有任何喜欢的网站。 – sled 2014-05-23 02:34:18
'sort'不通过SQL IIRC – alternative 2011-05-30 22:43:34
做,如果网站在@popularwebsites数低,这可能是可以接受的。但是,如果您先将所有网站放入该阵列中,然后进行实时排序,则该方法将变得昂贵和快速。另外,由于x.likes.count必须进行数据库查询,因此会遇到称为N + 1查询问题的问题。 – randomguy 2011-05-30 22:44:09