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

时间:2010-01-21 15:29:07

标签: ruby-on-rails activerecord initialization callback

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

# app/models/message.rb
class Message < ActiveRecord::Base
  before_save :foo
  def foo
     puts 'foo!'
  end
end

我希望能够做到:

# 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

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

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

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

2 个答案:

答案 0 :(得分:9)

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

class Message < ActiveRecord::Base
  include Message::Callbacks
end

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

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

  def foo
    # ...
  end
end

这样做的缺点是使方法受到保护还需要做更多的工作。

答案 1 :(得分:2)

为什么不使用观察员? (http://api.rubyonrails.org/classes/ActiveRecord/Observer.html

例如,您可以执行以下操作:

class MessageObserver < ActiveRecord::Observer
  def before_save(message)
    puts 'you win at ruby!'
  end
end