2011-02-10 125 views
3

可以說我有Posts很多Comments可以通過活動記錄中關聯的數量進行排序嗎?

是否有可能做一個ActiveRecord查詢來獲得大多數評論排序的帖子?

我很驚訝這個普通的查詢在普通的老式MySQL中似乎沒有簡單的答案。是的,您可以使用counter_cache,但這並不是真的重新創建原始查詢。

我錯過了什麼?

更進一步。如果Posts有很多Comments,那麼有很多Likes。是否有可能獲得聚合最喜歡的帖子?

謝謝!

回答

1

正如你所說,counter_cache似乎是最接近做它的「鐵軌方式」。到目前爲止,我還沒有遇到這個特定目的的任何AR定義的方法,但是這是最接近它,我看到:

@posts = Post.select("posts.*, COUNT(comments.id) AS count_comments").joins("LEFT OUTER JOIN comments ON posts.id = comments.post_id").group("posts.id").order("count_comments DESC") 

@posts.each do |post| 
    puts "Comments: #{post.count_comments}" 
end 

自定義選擇包括count_comments屬性。加入而不是包含,因爲include會覆蓋選擇語法。自定義連接語法,而不僅僅是:註釋,因爲否則它將是內部連接,這將防止沒有評論的文章被檢索。

這基本上是寫整個SQL語法自己,但仍...工程:)

+0

是的,我認爲這是唯一的解決方案。所有這些自定義SQL真的很癢:)如果他們添加一種更乾淨的方式來完成某一天的活動記錄,將會很有趣。 – 2011-02-13 01:29:29

+0

我不認爲,考慮到AREL現在提供的功能,對於這樣一個簡單的查詢使用raw sql是有意義的。它對我來說看起來很不雅觀。 – 2011-07-18 15:57:42

0

敢肯定你可以做這樣的事情,以及如果你想:

posts = Post.find(:all, :include => 'comments') 
posts.sort { |a,b| b.comments.count <=> a.comments.count } 
0

我supose你可以做這樣的事情使用arel ::

comments= Comment.arel_table 
posts= Post.joins(:comments).order(comments[:id].count) 

雖然,我不確定這是否是正確的方式來做到這一點。你將不得不自己嘗試。

相關問題