如何对一组记录 using/via ActiveRecord 进行布尔运算?

How to do a boolean operation on a set of records using/via ActiveRecord?

我的任务是确定记录子集的所有布尔属性是否为 true。在使用 sum 之后,我希望有一个类似的方法来处理布尔值。但是,我找不到这样的东西。

我觉得很有可能答案非常清楚、直接并且可以通过简单的 Google 搜索获得,但我想不出正确的短语来搜索它。

我正在努力实现的示例:

[
  #<User id: 1, name: "John", arborist: true>,
  #<User id: 2, name: "Ben", arborist: true>,
  #<User id: 3, name: "Betty", arborist: false>,
]

应该returnfalse

[
  #<User id: 1, name: "John", arborist: true>,
  #<User id: 2, name: "Ben", arborist: true>,
  #<User id: 3, name: "Betty", arborist: true>,
]

应该returntrue


目前我正在使用count

all_arborists? = ( User.count == User.where(arborist: true).count )

它让我得到了结果,但我觉得它的意义超出了我的想象。

如果您已经将记录加载到内存中,并且正在使用数组,则可以使用 Ruby 的 #all? 方法:

all_arborists = records.all? { |r| r.arborist }

如果记录在数据库中并且您不想将它们加载到内存中,那么您需要一个 SQL 查询,并且您尝试的是在正确的路径上:

non_arborists = User.where(some_condition: foo).where(arborist: false).count
all_arborists = non_arborists == 0

您可以简单地检查数据库中是否有一个 non-arborist:

all_arborists = !User.exists?(arborist: false)

您可以将其定义为 class 方法,rails 魔法将使它在所有范围内可用:

class User
  def self.all_arborists?
    !exists?(arborist: false)
  end
end

User.where(some_condition: foo).all_arborists?

在用户 class 上使用 :pluck 方法获取树艺师列值,然后使用数组方法 all? 检查所有值是否为真。

User.pluck(:arborist).all?