ActiveRecord :: Relation не утруждает себя связью с базой данных, пока вы не запросите у нее некоторые данные. Например:
User.where(:name => "Thiago").limit(3).using(:slave_one).count
# talks to the database here ----------------------------^^^^^
Если вы посмотрите на ActiveRecord :: Relation, вы увидите, что он включает в себя ActiveRecord :: QueryMethods и большинство из них выглядит следующим образом:
def x(*args)
relation = clone
# merge args into relation
relation
end
Таким образом, Relation просто строит запрос по частям, пока вы не сделаете что-то, требующее выполнения запроса; затем он создаст соответствующий SQL, отправит его в базу данных и сделает что-то полезное (теоретически) с тем, что база данных отправит обратно.
Также обратите внимание, что каждый из методов QueryMethods возвращает клонированное и измененное отношение, поэтому вы можете делать такие вещи:
r1 = User.where(:name => 'Pancakes')
r2 = r1.limit(3)
, а затем используйте r1
, чтобы захватить все спички, или r2
, чтобы просто взять три из них.