我正在为一个包含 200 多个模块的 Rails 应用开发一个 ApplicationModel。该应用程序非常大,以至于当我们 rails s
加载我们的应用程序实际上需要 40 秒。因此,在开发过程中,我们经常更改大量模块,要查看更改,我们必须重新加载应用。
所以我创建了一个 ApplicationModel 并将所有初始化程序移到该模型中,以便在开发中重新加载更改,我们不必再次重新启动服务器,每天节省大量时间。
我使 ApplicationModel 继承自 ActiveRecord::Base
并将其设为抽象类。所有其他模型都继承自该模型。所以现在我们可以将扩展 ActiveRecord 的初始化器放入这个模型中。
由于我正在从事其他人启动的项目,所以我不知道这两种扩展 ActiveRecord
的方式之间的区别,并且想知道它们之间的区别。
ActiveRecord::Base.send(:include, someModule)
ActiveRecord::Base.extend(ClassMethods)
最佳答案
首先,我认为您有点过于复杂了。如果您想在控制台中重新加载应用程序的模型,最好的选择是只运行 reload!
,而不是复杂的自定义解决方案。
二、这两种选择的区别:
ActiveRecord::Base.send :include, M
ActiveRecord::Base.extend M
是 include
将模块添加到类中,就像您将模块中的实例方法复制粘贴到类的定义中一样。
相比之下,extend
会将模块添加到元类中,就像您将模块中的实例方法复制粘贴到类中的 class << self
block 中一样。
这是一个说明性的例子:
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
关于ruby-on-rails - 扩展 ActiveRecord - 发送、扩展之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6809524/