Ruby on rails 扩展ActiveRecord-发送和扩展之间有什么区别?
我正在为Rails应用程序开发一个应用程序模型,该应用程序有200多个模块。该应用程序非常大,当我们Ruby on rails 扩展ActiveRecord-发送和扩展之间有什么区别?,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我正在为Rails应用程序开发一个应用程序模型,该应用程序有200多个模块。该应用程序非常大,当我们rails s加载应用程序时,实际上需要40秒。因此,在开发过程中,我们有大量经常更改的模块,为了查看更改,我们必须重新加载应用程序 因此,我创建了一个ApplicationModel,并将所有初始值设定项移动到该模型中,以便在开发过程中重新加载更改,并且我们不必再次重新启动服务器,从而每天节省大量时间 我使ApplicationModel继承自ActiveRecord::Base,并使其成为一个
rails s
加载应用程序时,实际上需要40秒。因此,在开发过程中,我们有大量经常更改的模块,为了查看更改,我们必须重新加载应用程序
因此,我创建了一个ApplicationModel,并将所有初始值设定项移动到该模型中,以便在开发过程中重新加载更改,并且我们不必再次重新启动服务器,从而每天节省大量时间
我使ApplicationModel继承自ActiveRecord::Base
,并使其成为一个抽象类。所有其他模型都继承自此模型。现在我们可以将扩展ActiveRecord的初始值设定项放到这个模型中
由于我正在从事一个其他人开始的项目,我不知道这两种扩展ActiveRecord
的方法之间的区别,我想知道它们之间的区别
ActiveRecord::Base.send(:include, someModule)
ActiveRecord::Base.extend(ClassMethods)
您看到的可能是:
ActiveRecord::Base.send( :include, InstanceMethods )
ActiveRecord::Base.extend( ClassMethods )
当您包含一个模块时,它的方法将成为类中的实例方法,当您扩展一个模块时,模块方法将插入到您“扩展”它们的实例变量中。在本例中,您正在扩展ActiveRecord::Base“class”实例(表示ActiveRecord::Base对象的class对象),这意味着这些方法将成为“class”方法
你可以在这里得到一个完整的解释:。首先,我认为你有点过于复杂了。如果您想在控制台中重新加载应用程序的模型,最好的选择是运行
reload代码>,不是复杂的自定义解决方案
第二,这两种选择之间的区别:
ActiveRecord::Base.send :include, M
ActiveRecord::Base.extend M
就是include
将模块添加到类中,就像将模块中的实例方法复制粘贴到类的定义中一样
相比之下,extend
会将模块添加到元类中,就像将模块中的实例方法复制粘贴到类+1中一样,但第一部分搞错了。我们试图重新加载初始值设定项。他们在config/initializers
soreload代码>不会触碰它们。但是现在有了应用程序模型reload
将在开发中起作用或只是任何响应。明白了——这对我来说并不明显,因为你说“我正在为一个有200多个模型的Rails应用程序开发一个应用程序模型。”谢谢你的澄清!(啊,我看到几分钟前它被更正为“超过200个模块”)对。希望这能让事情变得更清楚。但我确实在问题的下面陈述了这是模块而不是模型。
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