запрос в стиле .map с использованием .where в ActiveRecord

#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.