在单独的文件(RoR)中为模型类添加回调

San*_*ino 1 activerecord initialization ruby-on-rails callback

我有一个Message模型类(继承自ActiveRecord :: Base).对于特定部署,我希望有一个单独的文件,通过添加回调来修改Message.所以,而不是做:

# app/models/message.rb
class Message < ActiveRecord::Base
  before_save :foo
  def foo
     puts 'foo!'
  end
end
Run Code Online (Sandbox Code Playgroud)

我希望能够做到:

# app/models/message.rb
class Message < ActiveRecord::Base
end

# config/initializers/fixes.rb
Message
class Message
  before_save :foo
  def foo
     puts 'foo!'
  end
end
Run Code Online (Sandbox Code Playgroud)

问题是,它在我启动脚本/控制台时有效,但是当我使用脚本/服务器启动它时通常不会.这是最糟糕的部分,并不是它永远不会奏效.有时我启动服务器并且它可以工作,有时它不工作,而且没有对源进行任何更改.

我正在重新启动服务器本身(据我所知)初始化程序只运行一次,如果修改则不会重新加载.

我知道'有时'的作品很模糊,但我在这里花了好几个小时没有运气.也许某人有类似的问题,或者可以想出一个不同的想法来添加回调.

tad*_*man 9

为什么不将它们放入模块并导入它?

class Message < ActiveRecord::Base
  include Message::Callbacks
end
Run Code Online (Sandbox Code Playgroud)

在另一个文件中,您可以定义任何您喜欢的内容,例如message/callbacks.rb:

module Message::Callbacks
  def self.included(base)
    base.class_eval do
      before_save :foo
    end
  end

  def foo
    # ...
  end
end
Run Code Online (Sandbox Code Playgroud)

这方面的缺点是使方法受到保护的工作量更大.