ActiveRecord .where() 方法被忽略



我有一个奇怪的问题...在与模型兴趣无关的模型用户中,我尝试调用此查询:

# 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')
=> "[]"

最新更新