Понимание методов делегата и области действия в Rails - PullRequest
2 голосов
/ 18 февраля 2011

В active_record / base.rb, module ActiveRecord вы можете увидеть этот код:

delegate :find, :first, :last, :all, :destroy, :destroy_all, :exists?, :delete, 
             :delete_all, :update, :update_all, :to => :scoped

Давайте возьмем метод first, поэтому я предположил, что метод first делегирует метод scoped итогда scoped должен вернуть первую запись из базы данных.Но scoped это просто аноним scope, как текущая конструкция делает свою работу?

В то же время, как работают динамические методы, такие как find_by_name, find_all_by_name_and_colour?

Спасибо

Ответы [ 3 ]

3 голосов
/ 18 февраля 2011

Согласно документации , delegate:

Предоставляет метод класса делегата для легко выставить содержащиеся объекты методы как свои. Пройдите один или несколько методы (указываются в виде символов или строки) и название цели объект с помощью опции: to (также символ или строка)

Таким образом, это делегирует методы в списке методу scoped, который определен в ActiveRecord :: NamedScoped :: ClassMethods и который возвращает анонимную область действия .

Что касается того, почему ActiveRecord делает это, то мы можем продолжать использовать знакомые методы, такие как find, в то время как AR на самом деле вызывает причудливые новые методы Arel. Например, когда вы делаете

Post.find(37)

На самом деле исполняется:

Post.where(primary_key.eq(37))
1 голос
/ 18 февраля 2011

Во-первых: «делегировать» делегаты объекту, а не методу, поэтому «область действия» должна быть каким-то объектом.

Не проверяя источник для проверки и просто продолжая свои рабочие знания ActiveRecord, я 'Я собираюсь предположить, что "scope" будет текущим экземпляром AR, если только он не вызывается на прокси-сервере ассоциации.

Следовательно:

User.first # "scope" will be User

User.posts.first # "scope" will be the Post collection proxy

@ christianblais является правильным в вопросе № 2,method_missing обрабатывает эти вызовы.Кроме того, Rails фактически определяет отсутствующий метод при первом вызове, так что последующие вызовы к нему не повлекут за собой издержки method_missing

1 голос
/ 18 февраля 2011

Я отвечу на ваш второй вопрос.find_by_name и find_all_by_what_you_want полагаются на драгоценный метод ruby_missing.Когда метод не существует, объект вызывает method_missing, который вы можете перезаписать.Например, я могу захотеть перезаписать method_missing, перехватить все несуществующие вызовы методов, проверить с помощью регулярного выражения, если они начинаются / заканчиваются / содержат некоторые ключевые слова и т. Д.проверьте, начинается ли это с поиска, и, если да, разделите по ключевым словам ' и ', чтобы получить массив их атрибутов, с которыми я хочу выполнить поиск.хороший пример: http://technicalpickles.com/posts/using-method_missing-and-respond_to-to-create-dynamic-methods/

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