В этом случае self
не означает anObject, это скорее сахарная конструкция.
class << self
...
end
определяет методы класса для включающего объекта. Метод alias_method_chain
- это метод, который псевдоним вещей. В этом случае это псевдонимы от has_many
до has_many_without_association_options
и has_many_with_association_options
с has_many
. В вашем случае это псевдоним методов класса, поэтому вы должны использовать его в области видимости метода класса. Это позволяет расширять методы без особых хлопот.
Методы класса вызываются как, скажем:
SomeThing.bar_method
тогда как методы экземпляров вызываются для экземпляров класса:
assoc = SomeThing.new
assoc.foo_method
Соответствующий код будет:
class SomeThing
def foo_method
...
end
class << self
def bar_method
...
end
end
end
в вашем случае у вас есть модуль AttributeFu::Associations
. При включении в класс Foo он запускает Foo.class_eval, который определяет некоторые атрибуты экземпляра внутри Foo, и запускает метод alias_method_chain
внутри области действия методов класса (class << self
).
Также есть extends ClassMethods
, который должен определять либо:
def self.has_many_with_association_options
...
end
или
class << self
def has_many_with_association_options
...
end
end