Подтвердить что ты не робот

Rails нетерпеливо загружает счета?

Желательная загрузка хороша с атрибутом include

Post.find(:all, :include => :author)

Мне интересно, можете ли вы также рассчитывать на количество загрузок, например, если бы я хотел получить количество комментариев для каждого сообщения, не загружая все комментарии сами?

Может быть что-то вроде

Post.find(:all, :include => [:author, "count(comments)")

Я предполагаю, что могу использовать столбец count_cache. Но делать все это в составе было бы действительно красиво, если это возможно.

Дополнительные бонусные баллы, если кто-то может показать, как не только получить счет, но и поставить некоторые условия, например, количество одобренных только сообщений.

4b9b3361

Ответ 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

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