Каков принцип делегирования вызова метода в объектах ActiveRecord AssociationCollection? - PullRequest
0 голосов
/ 06 декабря 2011

Это часть моего кода:

class Company < ActiveRecord::Base
  has_many :employees
end

my_company = Company.first
employees = my_company.employees
puts employees.class
puts employees.methods.include? "create"
puts employees.respond_to? :create

вывод после выполнения кода выше:

Array
false
true

Даже если я переопределю «employee.method_mising" пустым телом методаметод create все еще существует и успешно запущен.Я хочу знать, как activerecord добавляет метод "create" к объекту "employee".С помощью отладчика Ruby я обнаружил, что метод «create» может быть добавлен в класс «ActiveRecord :: Associations :: AssociationCollection», я также пытался прочитать исходный код, но он слишком сложен для меня, я не смог найтиПринцип снизу.Значит, должен быть кто-то, кто знает этот принцип, верно?Не могли бы вы научить меня этому?

1 Ответ

0 голосов
/ 07 декабря 2011

После прочтения исходного кода active_record я обнаружил, что var «employee» является экземпляром класса «ActiveRecord :: Associations :: HasManyAssociation» (<«ActiveRecord :: Associations :: AssociationCollection» <«ActiveRecord :: Associations: : AssociationProxy ") собственно. Фактически, они отменяют определение практически любых методов (включая «методы», «класс» и т. Д.) В AssociationProxy, добавив следующую строку кода: </p>

      instance_methods.each { |m| undef_method m unless m.to_s =~ /^(?:nil\?|send|object_id|to_a)$|^__|^respond_to_missing|proxy_/ }

и они используют целевой объект (в моем случае это экземпляр Array) для делегирования методов "undef", а методы response_to? И т. Д. Делегируются объекту "proxy", который имеет " create / build "method.So" employee.respond_to?: create "возвращает true, но список методов, возвращаемый при вызове метода" employee.methods ", не содержит метод create.

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