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

标签 ruby-on-rails activerecord

我正在为一个包含 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/

相关文章:

ruby-on-rails - 如何在 ActiveRecord 中从父级调用子模型范围?

ruby-on-rails - 如何在 Heroku 上提供嵌套的静态内容?

sql - Rails - 返回所有对象的 SQL 查询,这些对象具有所有指定的相关对象(has_many through)

ruby-on-rails - Dockerfile 应该如何使用yarn 运行默认的rails 6 项目?

javascript - Ruby on Rails jQuery : Toggle not working

ruby-on-rails - 建立ActiveRecord关系而不让它执行查询

sql - "Popular"用户的 Rails 高效 SQL

ruby-on-rails - Rails 添加自定义急切加载

ruby-on-rails - 从 Active Record 范围内访问类方法?

mysql - ActiveRecord 关联 : am I doing it right?