Добавьте сохраняют обратный вызов к единственному экземпляру ActiveRecord, действительно ли это возможно?

Действительно ли возможно добавить обратный вызов к единственному экземпляру 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
5
задан Shripad Krishna 16 June 2010 в 12:08
поделиться

2 ответа

Вы можете сделать что-то подобное, добавив обратный вызов к объекту сразу после его создания и, как вы сказали, исправив 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
5
ответ дан 13 December 2019 в 19:24
поделиться

Для чего-то вроде этого вы всегда можете определить свои собственные сумасшедшие обработчики:

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
3
ответ дан 13 December 2019 в 19:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: