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) }

问题是助手变得丑陋,另一个问题是我需要活动的播放列表(由我在播放列表模型中的范围定义)

有没有办法清理我的助手或使用范围来获取所有用户公司的活动播放列表计数

4

2 回答 2

4

您可以反过来运行查询:

Playlist.active.where(:company_id => user.companies.local(site_id)).count
于 2012-06-19T13:23:31.153 回答
1

您可以将范围应用于关联。试试这个:

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

另一个优点是它将执行select count(*) ...SQL 语句,而不是从数据库中获取所有活动的播放列表并在 Ruby 中计算它们。

如果您关心性能,那么在单个 SQL 语句中加入表并计算所有用户公司的活动播放列表会更有效,而不是遍历公司并为每个公司进行计数查询。

于 2012-06-19T13:15:44.757 回答