2015-04-17 37 views
6

我需要預先加載模型與複雜條件的關聯。 NO,includes不適用於我。它爲我的任務生成錯誤的SQL。如何爲Rails關聯::預加載器設置預加載範圍?

我看看到ActiveRecord::Associations::Preloader,發現他採取preload_scope參數:

http://apidock.com/rails/v4.2.1/ActiveRecord/Associations/Preloader/preload

def preload(records, associations, preload_scope = nil) 
    # ... 
end 

但使用它,我無法找到任何例子。這種情況下preload_scope是什麼?我如何使用它來過濾關聯? 謝謝!

回答

2

ActiveRecord不通過#preloads關係: https://github.com/rails/rails/blob/0aefa97689d001ca9a98db76bbad1bbbb0e51c9c/activerecord/lib/active_record/relation.rb#L663公開 - 你可以看到只有記錄和關聯參數被傳遞。

可以伸進ActiveRecord的內部和直接調用預載:

rows = Projects.all.to_a 
ActiveRecord::Associations::Preloader.new.preload(rows, :current_task, Struct.new(:values, :bind_values).new({where: "active"}, [])) 
+0

哦,謝謝,它的工作原理!但爲什麼它會產生如此多的查詢? (52,50,51,53) 'User Load(12.1ms)SELECT「用戶負載(1.2ms)SELECT「users」。* FROM「users」WHERE(created_at>'2015-01-01') User Load(5.1ms)SELECT「users」。* FROM「users」' – Vladimir

+0

你的代碼? –

+0

'users = Car.find(1).users rows = users.to_a ActiveRecord :: Associations :: Preloader.new.preload(rows,:activities,Struct.new(:values,:bind_values).new( {where:「created_at>'2015-01-01'」},[]))' – Vladimir