有没有更好的方法在红宝石中找到这个

时间:2012-06-19 13:04:23

标签: ruby-on-rails ruby ruby-on-rails-3 scope

好的,所以我有这个帮手

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 个答案:

答案 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语句中为所有用户的公司连接表并计算活动播放列表会更高效,而不是迭代公司并对每个公司进行计数查询。