这是any?
为了什么。
class Foo < ActiveRecord::Base
def children?
things.any? || items.any? || widgets.any?
end
end
由于这已成为争论的话题,我向您介绍:
> foo = Foo.last
Foo Load (0.6ms) SELECT "foos"......
> foo.items
Item Load (0.9ms) SELECT "items".*.......
> foo.items.any?
=> true #OH, WHAT's that? NO SQL CALLS? GEE WILLICKERS
> foo.items.exists?
Item Exists (0.5ms) #Hmmmmmm....
=> true
这里的要点是,在任何情况下,exists
都会进行 DB 调用,any?
如果spaces
总是加载到内存中,则不会。现在正如我所说,很多时候,重要的不是数据库调用的效率(是的,SQL 调用exists?
效率更高),但any?
不一定会调用数据库,这是一个巨大的事实优势。寻找自己:
[20] pry(main)> Benchmark.measure { foo.item.exists? }
Item Exists (0.5ms) SELECT 1 AS one FROM "items" ...
=> #<Benchmark::Tms:0x007fc1f28a8638
@cstime=0.0,
@cutime=0.0,
@label="",
@real=0.002927,
@stime=0.0,
@total=0.00999999999999801,
@utime=0.00999999999999801>
[21] pry(main)> Benchmark.measure { foo.items.any? }
=> #<Benchmark::Tms:0x007fc1f29d1aa0
@cstime=0.0,
@cutime=0.0,
@label="",
@real=7.6e-05,
@stime=0.0,
@total=0.0,
@utime=0.0>
如需更简洁的时间安排,请查看以下内容:
> Benchmark.measure { 1000.times {foo.items.exists?} }.total
=> 2.5299999999999994
> Benchmark.measure { 1000.times {foo.items.any?} }.total
=> 0.0
现在,正如我所说,很多时候,这取决于具体情况——您可能在很多情况下这些项目没有加载到内存中,但很多时候,它们是。根据您如何称呼它,选择最适合您的。