ActiveRecord .where()方法被忽略

时间:2013-06-25 15:27:19

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

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

# 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

有什么想法吗? 谢谢大家。

1 个答案:

答案 0 :(得分:3)

在您真正尝试访问结果之前,Rails不会评估查询。致电Model.where只会返回一个ActiveRecord::Relation,您可以将where / order /等电话转接到其上。

尝试此操作(.all强制查询查询并返回结果数组):

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

请注意,实际上不应该这样做。对于你的模型来说,只允许从方法返回ActiveRecord::Relation要好得多,因此调用代码可以对它应用额外的作用域/排序方法。

另请注意,如果您只使用id in (?),则Rails不会手动构建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')
=> "[]"