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

zjude90 · 2015年07月01日 · 最后由 zlx_star 回复于 2015年07月02日 · 1873 次阅读

之前遇到了 数据库系统表被修改 导致的连接失败问题. 然后有人提醒过可以打个 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' 之前(感觉好黑科技)

需要 登录 后方可回复, 如果你还没有账号请 注册新账号