Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 扩展ActiveRecord-发送和扩展之间有什么区别?_Ruby On Rails_Activerecord - Fatal编程技术网

Ruby on rails 扩展ActiveRecord-发送和扩展之间有什么区别?

Ruby on rails 扩展ActiveRecord-发送和扩展之间有什么区别?,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我正在为Rails应用程序开发一个应用程序模型,该应用程序有200多个模块。该应用程序非常大,当我们rails s加载应用程序时,实际上需要40秒。因此,在开发过程中,我们有大量经常更改的模块,为了查看更改,我们必须重新加载应用程序 因此,我创建了一个ApplicationModel,并将所有初始值设定项移动到该模型中,以便在开发过程中重新加载更改,并且我们不必再次重新启动服务器,从而每天节省大量时间 我使ApplicationModel继承自ActiveRecord::Base,并使其成为一个

我正在为Rails应用程序开发一个应用程序模型,该应用程序有200多个模块。该应用程序非常大,当我们
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
so
reload不会触碰它们。但是现在有了应用程序模型
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