#ruby-on-rails #ruby-on-rails-3 #activerecord
#ruby-on-rails #ruby-on-rails-3 #activerecord
Вопрос:
Возьмем этот сценарий:
Чтобы просмотреть количество компаний по всем элементам, я могу написать:
@counts = Item.all.collect{|i| i.companies.count}
Можно ли сделать аналогичную вещь, .where
чтобы вернуть ТОЛЬКО те элементы, которые есть count > 0
?
@items_with_companies = Item.where{|i| i.companies.count > 0}
Для ясности мне не нужен конкретный ответ на приведенный выше случай — я ищу общее решение, которое обеспечило бы гораздо большую гибкость в моих запросах, чем я использую в настоящее время!
Ответ №1:
Наиболее эффективный способ сделать это — добавить столбец кэша счетчика в Item
class Item
# items must have a column named companies_count
has_many :companies, :counter_cache => true
scope :with_companies, where('companies_count>0')
end
Есть и другие способы, например, выполнение подзапросов или join amp; group amp; count .
Важно то, что все, что вы пишете, where
будет выполняться в базе данных, поэтому оно ограничено тем, что может делать SQL.