Во-первых, я думаю, вы немного усложняете это. Если вы хотите перезагрузить модели вашего приложения в консоли, лучше всего просто запустить reload!
, а не сложное пользовательское решение.
Во-вторых, разница между этими двумя вариантами:
ActiveRecord::Base.send :include, M
ActiveRecord::Base.extend M
означает, что include
добавляет модуль в класс, как если бы вы скопировали методы экземпляра в модуле прямо в определение класса.
Напротив, extend
добавит модуль в метакласс, как если бы вы скопировали методы экземпляра в модуле в блок class << self
в классе.
Вот иллюстративный пример:
module InstanceMethods
def foo; "foo"; end
end
class ActiveRecord::Base
include InstanceMethods
end
ActiveRecord::Base.instance_methods.include? :foo
=> true
Но:
module ClassMethods
def bar; "bar"; end
end
class ActiveRecord::Base
extend ClassMethods
end
ActiveRecord::Base.instance_methods.include? :bar
=> false # hmm, it's not an instance method...
ActiveRecord::Base.singleton_class.instance_methods.include? :bar
=> true # ... it's a class method, aka an
# instance method on the metaclass