Rails扩展ActiveRecord :: Base

我已经做了一些关于如何扩展ActiveRecord:Base类的阅读,这样我的模型就会有一些特殊的方法。 什么是简单的方法来扩展它(一步一步的教程)?


有几种方法:

使用ActiveSupport :: Concern(首选)

阅读ActiveSupport :: Concern文档以获取更多详细信息。

lib目录中创建一个名为active_record_extension.rb的文件。

module ActiveRecordExtension

  extend ActiveSupport::Concern

  # add your instance methods here
  def foo
     "foo"
  end

  # add your static(class) methods here
  class_methods do
    #E.g: Order.top_ten        
    def top_ten
      limit(10)
    end
  end
end

# include the extension 
ActiveRecord::Base.send(:include, ActiveRecordExtension)

config/initializers目录下创建一个名为extensions.rb的文件,并将以下行添加到文件中:

require "active_record_extension"

继承(首选)

参考Toby的答案。

猴子修补(应该避免)

config/initializers目录下创建一个名为active_record_monkey_patch.rb

class ActiveRecord::Base     
  #instance method, E.g: Order.new.foo       
  def foo
   "foo"
  end

  #class method, E.g: Order.top_ten        
  def self.top_ten
    limit(10)
  end
end

有关Jamie Zawinski的正则表达式的着名引用可以重新用于说明与猴子修补有关的问题。

有些人遇到问题时,会想“我知道,我会用猴子补丁”。现在他们有两个问题。

猴子修补很简单,快捷。 但是,节省的时间和精力总是在未来的某个时候提取出来。 与复利。 现在我限制猴子修补,以便在轨道控制台中快速构建原型解决方案。


你可以扩展这个类并简单地使用继承。

class AbstractModel < ActiveRecord::Base  
  self.abstract_class = true
end

class Foo < AbstractModel
end

class Bar < AbstractModel
end

你也可以使用ActiveSupport::Concern并使用更多的Rails核心ActiveSupport::Concern

module MyExtension
  extend ActiveSupport::Concern

  def foo
  end

  module ClassMethods
    def bar
    end
  end
end

ActiveRecord::Base.send(:include, MyExtension)

[编辑]来自@daniel的评论

然后,您的所有模型将包含作为实例方法的foo方法, ClassMethods的方法包含为类方法。 例如,在FooBar < ActiveRecord::Base您将拥有: FooBar.barFooBar#foo

http://api.rubyonrails.org/classes/ActiveSupport/Concern.html

链接地址: http://www.djcxy.com/p/56893.html

上一篇: Rails extending ActiveRecord::Base

下一篇: Advantages of managing asset loading via AVAsset vs AVPlayerItem?