我有一个奇怪的问题...在与模型兴趣无关的模型用户中,我尝试调用此查询:
# file model.rb
def self.my_func
Interest.where('id IN (?)', [1,2])
end
但它完全被忽略了...如果我用这个替换:
# file model.rb
def self.my_func
Interest.find(1)
end
触发了 .find(( 方法,我得到了结果。
如果我直接打电话给Interest.where('id IN (?)', [1,2])
rails console
它就可以了......我在 RoR 3.2.13 上
知道吗?谢谢大家。
Rails 不会评估查询,直到您实际尝试访问结果。调用Model.where
只是返回一个ActiveRecord::Relation
,您可以将其他where
/order
/etc调用链接到该。
试试这个(.all
强制计算查询并返回结果数组(:
def self.my_func
Interest.where(id: [1,2]).all
end
请注意,实际上不应该这样做。对于模型来说,只允许从方法返回ActiveRecord::Relation
要好得多,因此调用代码可以对其应用其他范围/排序方法。
另请注意,如果您只使用 where(id: [1,2])
,Rails 足够智能,可以为您完成id in (?)
查询,而不是手动构建 查询。
奖金说明:
在终端上,结果会立即从Model.where
计算,因为 IRB 会根据您输入的每个表达式的结果调用inspect
,以便它有要打印的内容,并且返回的ActiveRecord::Relation
在检查时会评估其查询。你可以绕过这一点,通过添加;nil
来证明这一点,以便你的陈述计算结果为nil
;请注意,在我手动调用x.inspect
之前,SELECT
不会发生:
irb(main):008:0> x = User.where("name like 'bob'"); nil
=> nil
irb(main):009:0> x.inspect
User Load (0.5ms) SELECT "users".* FROM "users" WHERE (name like 'bob')
=> "[]"