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

推荐答案

有几种方法:

Using ActiveSupport::Concern (Preferred)

有关更多详细信息,请阅读ActiveSupport::Concern文档.

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

require 'active_support/concern'

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"

Inheritance (Preferred)

参考托比的answer.

Monkey patching (Should be avoided)

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,可以用来说明与猴子补丁相关的问题.

有些人在遇到问题时会想:"我知道,我会用

猴子修补是简单而快速的.但是,节省下来的时间和精力总是被提取回来

Ruby-on-rails相关问答推荐

合成轨道布局

ActiveAdmin:的呈现索引表在父级的显示页中有许多资源

如何在 Rails 中声明动态路由范围/命名空间变量?

错误 NoMethodError:ActionView::Base:Class 的未定义方法 `debug_rjs='

在 Ruby on Rails html.erb 文件中循环

如何启动 rails 控制台并专门使用测试数据库?

如何在两个日期之间生成随机日期和时间?

Rails:包含多态关联

在一行中更改多个对象属性

将 cookie 会话存储添加回 Rails API 应用程序

如何将自定义过滤器添加到 Active Admin?

在 Nokogiri 中获取属性值以提取链接 URL

使用 ActiveRecord 3 / Arel 查找单个记录的最佳方法?

简单表单关联自定义标签名称

在 Rails/ActiveRecord 列名中使用问号字符

如何在rails中异步加载部分页面

您推荐哪些工具来分析 Rails 应用程序?

停止 Rails 为视图和助手生成规范测试?

Rails,Docker:主机不存在:默认

ruby 方法名称中的变量