Вы можете использовать счетчик кэша.Это сохраняет целочисленное значение в родительском объекте с количеством детей.ActiveRecord отслеживает.
class Post < AR::Base
has_many :comments
end
class Comment < AR::Base
belongs_to :post, :counter_cache => true
end
@post.comments_count
Если вы действительно должны использовать один запрос без кэша счетчика:
@post = Post.find(first, :select => 'posts.*, count(comments.id) as comments_count',:joins => 'left outer join comments on comments.post_id = posts.id', :group => 'posts.id')
@post.comments_count #=> From join query.
Как видите, это становится ужасно быстро.Лучше придерживаться счетчика кэша или выполнить два отдельных запроса.
@post = Post.find(:first) # SELECT FROM posts
@post.comments.count # SELECT COUNT(1) FROM comments WHERE post_id = ?