ActiveRecord length vs size vs count
結論
キャッシュを使わないならcount
lengthはクエリの結果をloadするので件数取得のためだけには使わない length
recordsにdelegateされている
ActiveRecord::Relation#recordsはレコードをloadする
code:ruby
def records # :nodoc:
load
@records
end
code:ruby
def load(&block)
unless loaded?
@records = exec_queries(&block)
@loaded = true
end
self
end
つまり、クエリを実行し、その結果として返ってきたArrayのArray#lengthを呼ぶ
count
ActiveRecord::RelationがincludeしているActiveRecord::Relation::Calculationsの#count
relationがloaded?かどうかはチェックせずにSQLのCOUNTをDBに発行する size
クエリの結果がloaded?かどうかで挙動が変わる
code:ruby
def size
loaded? ? @records.length : count(:all)
end
loadされていたらキャッシュしている@recordsのArray#lengthを呼ぶ
loadされていなければActiveRecord::RelationがincludeしているActiveRecord::Relation::Calculationsの#countを呼ぶ