将保存回调添加到单个ActiveRecord实例,是否可能?

pup*_*eno 5 ruby activerecord ruby-on-rails

是否可以向单个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
Run Code Online (Sandbox Code Playgroud)

gro*_*ark 5

您可以通过在创建对象后立即向对象添加回调来执行类似的操作,就像您所说的那样,修补默认的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
Run Code Online (Sandbox Code Playgroud)