2016-12-21 55 views
0

考慮這兩個關聯模型,ProgramSpentFinanceRails包含協會與左連接條件

class Program < ApplicationRecord 
    has_many :spent_finances 
end 

class SpentFinance < ApplicationRecord 
end 

每花費資金有time_period_type,如'year''month'

如何檢索所有程序,並同時預加載所有關聯的spent_finances與某個具有某種time_period_type的程序關聯?

注:

  • 查詢必須檢索所有程序,包括不具有所要求的時間段類型的任何花費財政計劃。
  • 應該提供一種方法以編程方式更改time_period_type查詢

這些都是我在破解這一問題所做的嘗試。

首次嘗試

Program 
.references(:spent_finances) 
.includes(:spent_finances) 
.merge(SpentFinance.where(time_period_type: time_period_type)) 

這是不行的,因爲它過濾掉不花了財政與指定的時間段類型的程序。 (它添加了time_period_type條件WHERE子句而不是JOIN ON子句。)

第二次嘗試

class Program < ApplicationRecord 
    has_many :yearly_spent_finances, 
    -> { where(time_period_type: 'year') }, 
    className: 'SpentFinance' 
end 

programs = Program.references(:yearly_spent_finances).includes(:yearly_spent_finances) 

programs[0].yearly_spent_finances 

此作品(最後一行不執行另一個查詢),而事實上它是officially recommended solution。但是,它不允許我以編程方式指定所需的time_period_type。例如,如果我想執行與上面類似的查詢,但將time_period_type更改爲'month',那麼我將不得不添加另一個關聯has_many :monthly_spent_finances

+0

你有沒有試過'Program.joins(:spe​​nt_finances).includes(:spe​​nt_finances) .merge(SpentFinance.where(time_period_type:time_period_type))'? – Thanh

回答

0

首次嘗試啓發,只要你想急於負載的加入,給一個嘗試以下操作:

Program.includes(:spent_finances).where(spent_finances: {time_period_type: time_period_type}).references(:spent_finances)