Как вы говорите, 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, но все же ... это работает:)