Можно ли заказать по количеству ассоциаций в активной записи? - PullRequest
3 голосов
/ 10 февраля 2011

Допустим, у меня есть Posts со многими Comments

Можно ли сделать запрос ActiveRecord, чтобы получить сообщения, упорядоченные по большинству комментариев?

Я удивлен, что этот относительно распространенный запрос в простом старом MySQL, кажется, не имеет простого ответа в AR. Да, вы можете использовать counter_cache, но это на самом деле не воссоздает исходный запрос.

Чего мне не хватает?

Делая это еще на шаг дальше. Что если у Posts есть много Comments, у которых много Likes. Можно ли получить сообщения с наибольшим количеством лайков в совокупности?

Спасибо!

Ответы [ 3 ]

1 голос
/ 10 февраля 2011

Как вы говорите, 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. Объединяет вместо включения, потому что включение переопределит синтаксис выбора. Синтаксис пользовательских объединений, а не просто: комментарии, потому что в противном случае это будет внутреннее объединение, которое не позволит получать сообщения без комментариев.

Это в основном сам пишет весь синтаксис SQL, но все же ... это работает:)

0 голосов
/ 18 июля 2011

Я полагаю, вы можете сделать что-то подобное, используя arel ::

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

Хотя я не уверен, что это правильный способ сделать это.Вам придется попробовать это самостоятельно.

0 голосов
/ 10 февраля 2011

Уверен, что вы можете сделать что-то подобное, если хотите:

posts = Post.find(:all, :include => 'comments')
posts.sort { |a,b| b.comments.count <=> a.comments.count }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...