Rails 如何正确地给 ActiveRecord::ConnectionAdapters 打一个 猴子补丁?

zjude90 · July 01, 2015 · Last by zlx_star replied at July 02, 2015 · 1873 hits

之前遇到了 数据库系统表被修改 导致的连接失败问题. 然后有人提醒过可以打个 monkey patch .

monkey patch 看起来 好像很简单嘛!对于一个已经声明的模块,require ' <自己修改过补丁文件>' 猴补丁就生效了! 于是我写了这样一个文件

module ActiveRecord
  module ConnectionAdapters
    module PostgreSQL
      module SchemaStatements
...

修改函数里的sql 字符串

...  
       end
     end
    end
  end

保存在 config/initializers 里面 , 然后 执行 rails c 想看看效果. 结果是 model 类 依然使用默认的 adapter 代码。所以还是报 老问题的错 即使我在 console 里执行

require 'config/initializers/active_monkey'

依然如此 所以,请问 什么才是 给 ActiveRecord 打一个猴补丁的正确方式 呢?

尽量避免使用 Monkey Patch

如果一定要使用,推荐这样:

# file: active_monkey.rb 
module ActiveMonkey
   # 修改函数里的sql 字符串
   # 或许你会用到 alias_method_chain
end

ActiveRecord::ConnectionAdapters::PostgreSQL::SchemaStatements::ClassName.include(ActiveMonkey)

# everwhere you want to include active_monkey
require 'active_monkey'

你这边应该是在 require 的时候,ConnectionAdapters 已经使用了(已经完成数据库初始化),需要重新 Load 才或者早于 数据库初始化 require, 比如说 require 'rails/all' 之前(感觉好黑科技)

You need to Sign in before reply, if you don't have an account, please Sign up first.