我有一個模型叫網站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