我有一个奇怪的问题......在模型用户中,与模型兴趣无关,我尝试调用此查询:
# 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
有什么想法吗? 谢谢大家。
答案 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')
=> "[]"