2012-06-19 6 views
0

нормально так что я этот помощникЕсть ли лучший способ сделать это найти в рубин

def playlist_count(user, site_id) 
    user.companies.local(site_id).map(&:playlists).flatten.count 
end 

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

class Playlist < ActiveRecord::Base 
    belongs_to :company 
    scope :active, where('end_date >= ? AND player_id IS NOT NULL', Date.today) 

class Company < ActiveRecord::Base 
    has_many :playlists, :dependent => :destroy 
    scope :local, lambda{ |site_id| where(:site_id => site_id) } 

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

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

+2

Вы должны обернуть активную область аргумента в лямбда, так что Date.today оцениваются в любое время области называется. 'scope: active, lambda {where (...)}' –

ответ

4

Вы можете запустить запрос наоборот:

Playlist.active.where(:company_id => user.companies.local(site_id)).count 
+0

Does: company_id => user.companies.local (site_id) создает предложение SQL in, потому что возвращается более одной записи – Trace

+0

Да, она создает что-то вроде ' SELECT COUNT (*) FROM плейлист WHERE playlist.company_id IN (SELECT company.id FROM company WHERE ...) ' – Stefan

+0

Ах, этот, очевидно, лучше моего. –

1

Вы можете применить области применения к ассоциациям. Попробуйте это:

user.companies.local(site_id).map { |company| company.playlists.active.count }.sum 

Еще одно преимущество заключается в том, что он будет выполнять select count(*) ... SQL заявление вместо извлечения всех активных списков воспроизведения из БД и подсчета их в Ruby.

Если вы заботитесь о производительности, будет более эффективно объединять таблицы и подсчитывать активные плейлисты для всех пользовательских компаний в одном выражении SQL, а не итерации по компаниям и подсчет запросов для каждого из них.

Смежные вопросы