0

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

# 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() 方法被触发,我得到了结果。

如果我直接调用它就可以了……我在 RoR Interest.where('id IN (?)', [1,2])3.2.13rails console

任何想法?谢谢你们。

4

1 回答 1

3

在您实际尝试访问结果之前,Rails 不会评估查询。调用Model.where只是返回一个ActiveRecord::Relation你可以链接额外的where/ order/etc 调用。

试试这个(.all强制评估查询并返回结果数组):

def self.my_func
  Interest.where(id: [1,2]).all
end

请注意,实际上不应该这样做。ActiveRecord::Relation让您的模型只允许从方法返回要好得多,因此调用代码可以对其应用额外的范围/排序方法。

另请注意,id in (?)如果您只使用where(id: [1,2]).


奖金说明:

在终端上,结果会Model.where立即得到评估,因为 IRB 调用inspect您输入的每个表达式的结果,因此它有一些要打印的内容,并且返回的结果会ActiveRecord::Relation在检查时评估其查询。您可以通过添加绕过这一点来向自己证明这一点;nil,以便您的语句评估为nil; 请注意,在SELECT我手动调用之前不会发生x.inspect

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')
=> "[]"
于 2013-06-25T15:35:34.543 回答