我有一个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
问题是,它在我启动脚本/控制台时有效,但是当我使用脚本/服务器启动时,通常不会。这是最糟糕的部分,并不是它永远不会奏效。有时我启动服务器并且它可以工作,有时它不工作,而且没有对源进行任何更改。
我正在重新启动服务器本身(据我所知)初始化程序只运行一次,如果修改则不会重新加载。
我知道'有时'的作品很模糊,但我在这里花了好几个小时没有运气。也许有人有类似的问题,或者可以想出一个不同的想法来添加回调。
答案 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