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

もう 1 つの利点はselect count(*) ...、DB からすべてのアクティブなプレイリストを取得して Ruby でカウントする代わりに、SQL ステートメントを実行することです。

パフォーマンスが気になる場合は、テーブルを結合し、単一の SQL ステートメントですべてのユーザーの会社のアクティブなプレイリストをカウントする方が、会社を繰り返し処理してそれぞれのカウント クエリを作成するよりも効率的です。

于 2012-06-19T13:15:44.757 に答える