これが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 呼び出しを行うということです。何度も言ったように、重要なのは DB 呼び出しの効率ではありません(そして、SQL 呼び出しのほうが効率的です)。アドバンテージ。自分で探してください:any?
spaces
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
何度も言ったように、状況によって異なります。これらの項目がメモリに読み込まれない状況が多くありますが、多くの場合、読み込まれます。呼び出し方に応じて、最適なものを選択してください。