Rails 3 ActiveRecord метод цепочки, под капотом - PullRequest
7 голосов
/ 29 февраля 2012

Допустим, вы строите запрос, включающий цепочку из нескольких методов, например

Post.where('id > 10').limit(20).order('id asc').except(:order)

Мне интересно, что происходит за сценой? Предположительно, каждая часть цепочки поможет построить SQL SELECT, и после того, как цепочка «завершена», выполняется оператор, создаются модели и т. Д. Как он «узнает», где находится конец цепочки? Каждый метод возвращает ActiveRecord :: Relation, который создает фрагмент SQL?

1 Ответ

13 голосов
/ 29 февраля 2012

Вы правы, каждое из этих значений возвращает ActiveRecord::Relation.Каждый вызов метода основывается на отношении, к которому он был вызван (кроме первого, которому явно нечего строить, поскольку оно не было вызвано в отношении), и возвращает его.

Он «знает», гдеКонец цепочки объясняется тем, что запрос фактически не выполняется до тех пор, пока вы не попытаетесь манипулировать данными или не получить к ним доступ, и при этом (обычно неявно) вызывается to_a, который выполняется exec_queries.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...