Rails 3 ActiveRecord Query, возвращает все записи модели и включает количество связанных записей в один запрос - PullRequest
1 голос
/ 02 ноября 2010

У меня есть следующие модели:

class Keyword < ActiveRecord::Base
  has_many :tags
  has_many :studies, :through => :tags
end

class Tag < ActiveRecord::Base
  belongs_to :keyword
  belongs_to :study
end

class Study < ActiveRecord::Base
  has_many :tags
  has_many :keywords, :through => :tags
end

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

<ul>
<% @keywords.each do |keyword| %>
  <li><%= "(#{keyword.number_of_studies}) #{keyword.title}") %></li>
<% end %>
</ul>

Я уверен, что это возможно, вопрос: как?

1 Ответ

3 голосов
/ 02 ноября 2010

Вы можете использовать счетчик кэша.Это сохраняет целочисленное значение в родительском объекте с количеством детей.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 = ?
...