Rails 在 Rails 中想重新打开 Date 类 增加几个方法但是加载无效

yours2008 · 2016年03月03日 · 最后由 martin91 回复于 2016年03月07日 · 2845 次阅读
def self.first_quarter   #一季度
   [Date.new(Date.current.year,1,1), Date.new(Date.current.year,4,1)]
end

同理:二季度、三季度、四季度、全年 1、类不知道保存在哪里 就放在 lib 目录下建立 date.rb 文件 2、使用中 require 无效。

应该怎么做才能生效?

  1. 个人建议放 lib/core_ext/date.rb,你可以适当参考 active_support 的目录组织方式
  2. 手动 require,具体参考 https://gist.github.com/maxim/6503591

PS: 尽量不要用 monkey patch

放到 config/initializers/ 目录下即可

#2 楼 @martin91 更好一些的做法可以是放在 lib 下的文件夹中,然后在 config/initilizers 手动引用,这样看起来比较清晰

#3 楼 @geekjj 嗯嗯,我的习惯是完整或者自己完全开发的模块会放 lib 目录,但是只是对已有类库进行修改,我都是放 config/initializers/,或者用 decorator。

#4 楼 @martin91 非常感谢大家的解答,先按照 martin91 的解决方案,问题解决了。回头再研究 geekjj 和 waraludru 的防范。

#5 楼 @yours2008 补充下,如果打开类多的话,可以用 decorator 的方式,具体就是 config/application.rb 文件加入配置:

config.to_prepare do
  # Load application's model / class decorators
  Dir.glob(File.join(File.dirname(__FILE__), "../app/**/*_decorator*.rb")) do |c|
    Rails.configuration.cache_classes ? require(c) : load(c)
  end
end

这样就可以在启动服务器的时候加载响应文件了:

以我对 ActiveRecord::Base 的扩展为例,相应代码内容为:

# app/decorators/models/active_record/base_decorator.rb
ActiveRecord::Base.class_eval do
  def self.query_slave(force = true)
    # codes here

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