2011-05-30 54 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