В магии named_scope используются два трюка (или шаблона, если хотите).
Шаблон прокси - вызов именованного метода области действия для класса или ассоциации всегда возвращает экземпляр класса ActiveRecord :: NamedScope :: Scope, а не совокупность отфильтрованных AR объекты. Этот паттерн, хотя и очень полезный, иногда делает вещи немного размытыми, поскольку прокси-объекты по своей природе амбивалентны.
Ленивая загрузка - благодаря отложенной загрузке (что в данном контексте означает - попадание в базу данных только в случае необходимости) именованные области можно связать в цепочку до того момента, когда вам нужно работать с коллекцией, определяемой прицелы. Всякий раз, когда вы запрашиваете базовую коллекцию, все связанные области оцениваются и выполняется запрос к базе данных.
Последнее замечание: при работе с именованными областями (или с любой вещью, использующей делегирование какого-либо рода) в IRB нужно иметь в виду одну вещь. Каждый раз, когда вы нажимаете Enter, вычисляется то, что вы написали заранее, и для возвращаемого значения вызывается метод inspect
. В случае цепочек именованных областей, хотя все выражение оценивается для экземпляра Scope, когда IRB вызывает для него метод inspect
, области оцениваются и выполняется запрос к базе данных. Это вызвано тем, что метод inspect
посредством делегирования распространяется через все объекты области действия до базовой коллекции.