Rails нетерпеливо загружает счета?
Желательная загрузка хороша с атрибутом include
Post.find(:all, :include => :author)
Мне интересно, можете ли вы также рассчитывать на количество загрузок, например, если бы я хотел получить количество комментариев для каждого сообщения, не загружая все комментарии сами?
Может быть что-то вроде
Post.find(:all, :include => [:author, "count(comments)")
Я предполагаю, что могу использовать столбец count_cache. Но делать все это в составе было бы действительно красиво, если это возможно.
Дополнительные бонусные баллы, если кто-то может показать, как не только получить счет, но и поставить некоторые условия, например, количество одобренных только сообщений.
Ответы
Ответ 1
В MySQL, по крайней мере, быстрее сделать это как два отдельных вызова, потому что вы избегаете соединения. Я знаю, что это не отвечает на ваш вопрос, но кажется, что вы пытаетесь получить лучшую скорость и делаете
Post.find ...
Тогда
post.comments.count
Быстрее и эффективнее памяти (для базы данных), чем если вы извлекаете оба в одном запросе.
Ответ 2
они должны быть загружены с использованием
post.comments.length
У меня была эта же проблема, потому что я использовал .count
Ответ 3
Построение ответа avaynshtok, следующий метод должен просто сделать 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 3 version:
@comment_counts = Comment.count(:group => :post_id)
# Rails 4 version:
# @comment_counts = Comment.group(:post_id).count
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 %>
Ответ 4
Попробуйте следующее:
Comment.count(:group => :post)
Фильтровать по условиям:
Comment.count(:group => :post, :conditions => {:approved => true })
Они возвратят хэши с сообщениями в виде ключей и количеством комментариев в качестве значений.
Ответ 5
Я просто столкнулся с этой задачей и решил ее так:
def trainee_counts
@trainee_counts ||= Hash[Trainee.group(:klass_id).count]
end
# where the count is needed
trainee_counts[klass_id].to_i
Один вызов в базу данных и не загружает стажеров.