ActiveRecord, цепочка методов и выполнение запроса

В настоящее время я пытаюсь понять, как ActiveRecord работает, чтобы связать методы условий, а затем выполнить запрос sql.

Понять цепочку методов довольно легко, и все, что я думал, хорошо объяснено и возобновлено здесь здесь.

Однако есть кое-что, чего я до сих пор не могу понять и что вышеприведенная статья не объясняет: как ActiveRecord узнает, когда выполнять SQL-запрос.

Например, если я закодирую User.where(some_column: "hello").limit(5), ActiveRecord создаст экземпляр построителя запросов, установит условия для значения some_column и ограниченного количества результатов.

Но после выполнения .limit(5) он также выполняет запрос и возвращает результат: откуда ActiveRecord может знать? Как он может знать, что это метод конечного условия и что он должен возвращать результат? Выполняет ли он SQL-запрос при каждом связанном условии?

В статье, которую я разместил выше, автор обманул, вызвав окончательный метод, each, который выполнял запрос и возвращал результат.


person Simon Ninon    schedule 05.10.2015    source источник
comment
Возможный дубликат цепочки методов Rails 3 ActiveRecord под капотом   -  person Brad Werth    schedule 06.10.2015
comment
Ознакомьтесь с edgeguides.rubyonrails.org/ и edgeguides.rubyonrails.org/   -  person Brad Werth    schedule 06.10.2015
comment
Это лучше объяснить здесь. to_a не вызывается неявно: он вызывается из переопределения метода проверки. Теперь это имеет смысл!   -  person Simon Ninon    schedule 06.10.2015


Ответы (1)


limit(5) не более особенный, чем where, фактически он возвращает ActiveRecord::Relation, как и where. Вы можете поменять порядок цепочки, чтобы доказать это.

User.where(some_column: "hello").limit(5)
User.limit(5).where(some_column: "hello")

Что происходит, так это то, что есть определенные методы, которые вызываются явно (например, в контроллере) или неявно (в CLI) инициируют выполнение запроса. Эти методы, например:

  • Перечислимые методы, такие как each, select и т. д.
  • Явные методы приведения, такие как to_a
  • Методы запросов, такие как first, last, take

Всякий раз, когда один из этих методов вызывается неявно или явно, выполняется запрос.

person Simone Carletti    schedule 05.10.2015