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

Один вызов в базу данных и не загружает стажеров.

Другие вопросы по тегам