2016-05-06 6 views
1

申し訳ありませんが、Accountsには多くのSchedulesがあり、多くはImpressionsです。Activerecord:特定の列と関連付けの関連カウントを集めます

私はAccounts.nameAccounts.schedulesのすべてを取得したいが、唯一のAccounts.schedules.dateAccounts.schedules.summaryを摘採し、またAccounts.schedules.impressions

の数がここ1つのアカウント(私はすべてのアカウントをお勧めします)

与えられた私が何をしたいの可視化です
Account: 
    .name 
    Schedules 
     .date 
     .summary 
     count(Schedule.impressions) 

そしてここでは、コードがあまりにも多くのクエリを次のようになります

Account.find_each do |account| 
    puts a.name # Account.name 
    a.schedules.each do |schedule| 
     puts schedule.date # Account.schedule.date 
     puts schedule.summary # Account.schedule.summary 
     puts schedule.impressions.count # Count(Account.schedule.impressions) 

できるだけ少ないクエリでこれをやりたいと思っています。私は効率と最適化が大好きです。

答えて

1

使用SELECTクエリ

Account. 
    joins(schedules: :impressions). 
    select("accounts.name as account_name, 
      schedules.date as schedule_date, 
      schedules.summary as schedule_summary, 
      count(impressions.id) as schedule_impression_count"). 
    group("accounts.name,schedules.date,schedules.summary") 

単一のクエリでそれを行う必要があり、その後のオブジェクトがschedule_date

あなたが他のデータのためにこれらのオブジェクトを使用する必要がある場合schedule_impression_countのように列の別名を対応させていただきます同じビューでAccount.eager_load(schedules: :impressions)も動作し、1つのクエリも実行されます。

+0

恐ろしく!これは本当にうまくいく! –

+0

accounts.nameでグループ化できる方法はありますか?だから私はそれらをループすると、同じ名前のスケジュールはすべて1つの配列にありますか? –

+1

@ Phatso727あなたは、 '{account1 => [ActiveRecord :: Relation]、account2 => [ActiveRecord:]のようにオブジェクトを' Hash'に変換するメソッドの最後に 'group_by(:account_name) :Relation]} 'あるいは' eager_load'メソッドを使うことができます。 – engineersmnky

関連する問題