2015-04-17 38 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