Действительно ли возможно добавить обратный вызов к единственному экземпляру ActiveRecord? Как дальнейшее ограничение это должно пойти на библиотеку, таким образом, я не управляю классом (кроме к патчу обезьяны это).
Это более или менее, что я хочу сделать:
def do_something_creazy
message = Message.new
message.on_save_call :do_even_more_crazy_stuff
end
def do_even_more_crazy_stuff(message)
puts "Message #{message} has been saved! Hallelujah!"
end
Вы можете сделать что-то подобное, добавив обратный вызов к объекту сразу после его создания и, как вы сказали, исправив AR по умолчанию before_save
метод:
def do_something_ballsy
msg = Message.new
def msg.before_save(msg)
puts "Message #{msg} is saved."
# Calls before_save defined in the model
super
end
end
Для чего-то вроде этого вы всегда можете определить свои собственные сумасшедшие обработчики:
class Something < ActiveRecord::Base
before_save :run_before_save_callbacks
def before_save(&block)
@before_save_callbacks ||= [ ]
@before_save_callbacks << block
end
protected
def run_before_save_callbacks
return unless @before_save_callbacks
@before_save_callbacks.each do |callback|
callback.call
end
end
end
Это можно сделать более общим, или расширение ActiveRecord :: Base, в зависимости от объема вашей проблемы. Использование должно быть простым:
something = Something.new
something.before_save do
Rails.logger.warn("I'm saving!")
end