ActiveRecord#any? 的使用比ActiveRecord#exists? 减少。有吗?在传递块的情况下,您可以检查该数组中的某些元素是否符合条件。类似于Enumerable#any?,但不要混淆它们。
ActiveRecord#any? 在其definition 的逻辑内实现Enumerable#any?,通过将访问的关系转换为数组,以防已将块传递给它并产生并访问块参数以在“手工”方式是“Ruby”any? 方式。
添加的方便else是为了返回对空的否定?应用于关系。这就是为什么您可以通过两种方式检查模型中是否有记录,例如:
User.count # 0
User.any? # false
# SELECT 1 AS one FROM "users" LIMIT ? [["LIMIT", 1]]
User.exists? # false
# SELECT 1 AS one FROM "users" LIMIT ? [["LIMIT", 1]]
您还可以签入“任何?”方式,如果某些记录属性具有特定值:
Foo.any? { |foo| foo.title == 'foo' } # SELECT "posts".* FROM "posts"
或者通过使用exists来节省“效率”?并改进您的查询和代码行数:
Foo.exists?(title: 'foo') # SELECT 1 AS one FROM "posts" WHERE "posts"."title" = ? LIMIT ? [["title", "foo"], ["LIMIT", 1]]
ActiveRecord#exists? 提供了许多实现,并且旨在在 SQL 级别上工作,而不是 any?,无论如何,如果你不传递一个块,它将把你正在使用的关系转换为一个数组。