可以說我有Posts
很多Comments
可以通過活動記錄中關聯的數量進行排序嗎?
是否有可能做一個ActiveRecord查詢來獲得大多數評論排序的帖子?
我很驚訝這個普通的查詢在普通的老式MySQL中似乎沒有簡單的答案。是的,您可以使用counter_cache,但這並不是真的重新創建原始查詢。
我錯過了什麼?
更進一步。如果Posts
有很多Comments
,那麼有很多Likes
。是否有可能獲得聚合最喜歡的帖子?
謝謝!
可以說我有Posts
很多Comments
可以通過活動記錄中關聯的數量進行排序嗎?
是否有可能做一個ActiveRecord查詢來獲得大多數評論排序的帖子?
我很驚訝這個普通的查詢在普通的老式MySQL中似乎沒有簡單的答案。是的,您可以使用counter_cache,但這並不是真的重新創建原始查詢。
我錯過了什麼?
更進一步。如果Posts
有很多Comments
,那麼有很多Likes
。是否有可能獲得聚合最喜歡的帖子?
謝謝!
正如你所說,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語法自己,但仍...工程:)
敢肯定你可以做這樣的事情,以及如果你想:
posts = Post.find(:all, :include => 'comments')
posts.sort { |a,b| b.comments.count <=> a.comments.count }
我supose你可以做這樣的事情使用arel ::
comments= Comment.arel_table
posts= Post.joins(:comments).order(comments[:id].count)
雖然,我不確定這是否是正確的方式來做到這一點。你將不得不自己嘗試。
是的,我認爲這是唯一的解決方案。所有這些自定義SQL真的很癢:)如果他們添加一種更乾淨的方式來完成某一天的活動記錄,將會很有趣。 – 2011-02-13 01:29:29
我不認爲,考慮到AREL現在提供的功能,對於這樣一個簡單的查詢使用raw sql是有意義的。它對我來說看起來很不雅觀。 – 2011-07-18 15:57:42