【问题标题】:ActiveRecord .where() method ignoredActiveRecord .where() 方法被忽略
【发布时间】:2013-06-25 15:27:18
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您是在迭代或调用#to_a 对抗my_func
  • my_func 返回什么?我不明白“完全忽略”。
  • 你对函数的结果做什么
  • 忽略我的意思是在控制台中,我根本看不到查询。如果我调用 .find() 而不是 .where() (在相同的上下文中),我会在控制台中看到查询。

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


【解决方案1】:

Rails 不会评估查询,直到您真正尝试访问结果。调用Model.where 只会返回一个ActiveRecord::Relation,您可以将其他where/order/etc 调用链接到该ActiveRecord::Relation

试试这个(.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;请注意,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')
=> "[]"

【讨论】:

  • 是的!你为我节省了很多时间!在我尝试访问结果之前,我不知道查询没有执行。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2014-12-09
  • 2013-09-04
  • 1970-01-01
  • 2016-04-18
  • 2018-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多