在Rails 3中,我可以对相关模型执行查询:
示例1:
model.associated_models.where(:attribute => 1)
associated_models是一个模型数组。
是否可以在manualy创建的模型数组上执行activerecord查询?
示例2:
[Model.create!(attribute: 1), Model.create!(attribute: 2)].where(:attribute => 1)
就像第一个例子中的associated_models它和模型数组一样,但我想在调用associated_models时会在后台发生一些事情。
我可以模拟这种行为以使示例2正常工作吗?
答案 0 :(得分:1)
我建议将Array#keep_if用于此任务,而不是将数组压缩到ActiveRecord :: Relation中。
[Model.create!(attribute: 1), Model.create!(attribute: 2)].keep_if { |m| m.attribute == 1 }
http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-keep_if (注意,Array#select!做同样的事情,但我更喜欢keep_if以避免在以后阅读时出现混淆,认为它可能与sql select有关)
答案 1 :(得分:1)
您可以通过适当的数据库范围“模拟”它
Model.where(:id => array_of_ar_objects.map(&:id), :attribute => 1)
(但这是错误的,因为您只想在需要时进行数据库调用)或使用数组搜索:
array_of_ar_objects.select { |model| model.attribute == 1 }
另请注意,model.associated_models不是数组,而是ActiveRecord::Associations::HasManyAssociation
,一种关联代理。这是非常棘手的,因为即使它的“类”方法被委托给它被强制使用的数组,这就是为什么你被误导的原因。
model.associated_models.class == Array
-> true