1

我有这个代码

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

Thecollection是一个ActiveRecord::Relation对象 - 例如User.where(:name => 'Killer')

现在有时我也会通过 Rails 4 none 关系Users.none,这就是为什么要检查 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

4

2 回答 2

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
于 2013-10-21T16:44:06.627 回答
0

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

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

不完全干净,但解决了问题

于 2013-10-21T15:17:40.527 回答