Rails жаждет загрузки графов?
Хорошая загрузка хороша с атрибутом включения
Post.find(:all, :include => :author)
Мне интересно, можете ли вы также увеличить количество загрузок, например, если бы я хотел получить количество комментариев для каждого поста, не загружая все комментарии сами?
Может быть что-то вроде
Post.find(:all, :include => [:author, "count(comments)")
Я полагаю, я мог бы использовать столбец count_cache. Но делать все это во включении было бы очень красиво, если это возможно.
Дополнительные бонусные баллы, если кто-то может показать, как не только получить счет, но и поставить некоторые условия, например, подсчет только утвержденных сообщений.
5 ответов
По крайней мере, в MySQL это проще сделать двумя отдельными вызовами, потому что вы избегаете объединения. Я знаю, что это не отвечает на ваш вопрос, но кажется, что вы пытаетесь набрать лучшую скорость и делаете
Post.find ...
затем
post.comments.count
Быстрее и эффективнее по памяти (для базы данных), чем при получении обоих в одном запросе.
Они уже должны быть загружены использовать
post.comments.length
У меня была такая же проблема, потому что я использовал.count
Опираясь на ответ авайнштока, следующая техника должна просто сделать 2 вызова базы данных.
# ./app/controllers/posts_controller.rb
def index
# First load the posts
@posts = Post.all
# Then you can load a hash of author counts grouped by post_id
# Rails 4 version:
@comment_counts = Comment.group(:post_id).count
# Rails 3 version:
# @comment_counts = Comment.count(:group => :post_id)
end
Тогда по вашему мнению
<!-- ./app/views/posts/index.html.erb -->
<% @posts.each do |post| %>
<!-- reference the count by the post.id -->
post_count: <%= @comment_counts[post.id] %>
<% end %>
Попробуй это:
Comment.count(:group => :post)
Для фильтрации по условиям:
Comment.count(:group => :post, :conditions => {:approved => true })
Они будут возвращать хэши с сообщениями в качестве ключей и количеством комментариев в качестве значений.
Я просто столкнулся с этой проблемой и решил ее следующим образом:
def trainee_counts
@trainee_counts ||= Hash[Trainee.group(:klass_id).count]
end
# where the count is needed
trainee_counts[klass_id].to_i
Один вызов в базу данных и не загружает стажеров.