在手动创建模型数组时执行activerecord查询

时间:2012-05-26 08:15:58

标签: ruby-on-rails ruby-on-rails-3 activerecord

在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正常工作吗?

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)

简短的回答是不,你不能。 Activerecord范围链构造对db的查询,这不能解释为任意数组,即使它是像您的示例中的AR对象数组。

您可以通过适当的数据库范围“模拟”它

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