0
考慮這兩個關聯模型,Program
和SpentFinance
:Rails包含協會與左連接條件
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
。
你有沒有試過'Program.joins(:spent_finances).includes(:spent_finances) .merge(SpentFinance.where(time_period_type:time_period_type))'? – Thanh