ActiveRecord没有?方法触发查询

时间:2013-10-21 14:41:57

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

我有这段代码

def evaluate(collection)
  if collection.none?
    []
  else
    collection.group(@group).pluck(*@columns)
  end
end

collectionActiveRecord::Relation个对象 - 例如User.where(:name => 'Killer')

现在有时我也传递Rails 4无关系Users.none,这就是检查无的原因。如果我不检查none?,则对pluck的调用会引发参数异常。

问题是每当我查询none?执行查询的任何关系时。见这里:

> User.where(id: 1).none?
User Load (0.2ms)  SELECT "users".* FROM "v1_passengers" WHERE     "users"."id" = 1
=> false

> User.where(id: 1).none.none?
=> true

我不想执行查询只检查无。任何解决方法?

更新:none?方法实际上是数组方法,这就是执行查询的原因。就像在关系上调用to_a一样。我想知道的是如何确定关系是否为none

2 个答案:

答案 0 :(得分:1)

找到一种方法来执行此操作而不触发查询。当您在某个关系上调用none时,会将ActiveRecord::NullRelation附加到该关系的extending_values数组中:

> User.where(id: 1).extending_values.include?(ActiveRecord::NullRelation)
=> false

> User.where(id: 1).none.extending_values.include?(ActiveRecord::NullRelation)
=> true

答案 1 :(得分:0)

不确定是否可以,空关系和实际关系之间没有区别特征。也许走下救援路线:

begin
  collection.group(@group).pluck(*@columns)
rescue #add exact Exception to catch
  []
end

不完全干净但是可以解决问题