好的,所以我有这个帮手
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) }
问题是帮助器变得难看,另一个问题是我需要活动播放列表(由播放列表模型中的范围定义)
有没有办法清理我的助手或使用范围来获取所有用户公司的有效播放列表数
答案 0 :(得分:4)
您可以反过来运行查询:
Playlist.active.where(:company_id => user.companies.local(site_id)).count
答案 1 :(得分:1)
您可以将范围应用于关联。试试这个:
user.companies.local(site_id).map { |company| company.playlists.active.count }.sum
另一个优点是它将执行select count(*) ...
SQL语句,而不是从数据库中获取所有活动的播放列表并在Ruby中计算它们。
如果您关心性能,那么在单个SQL语句中为所有用户的公司连接表并计算活动播放列表会更高效,而不是迭代公司并对每个公司进行计数查询。