Не перезаписывать notify_observers. Исправление основных классов - действительно плохая идея. Вместо того, что вы должны сделать, это:
Вместо вызова instance method на вашей модели, которая ограничено только имя метода, вызовите метод класса себя:
# Notify list of observers of a change.
def notify_observers(*arg)
observer_instances.each { |observer| observer.update(*arg) }
end
Она проходит вдоль каких-либо аргументов, которые вы даете это метод #update вашего наблюдателя, который вы можете перезаписать внутри своего собственного класса наблюдателя.
по умолчанию не принимает каких-либо посторонних аргументы, но не слишком сложно:
def update(observed_method, object, &block) #:nodoc:
return unless respond_to?(observed_method)
return if disabled_for?(object)
send(observed_method, object, &block)
end
Так просто добавить это к вашему наблюдателю, например:
def update(observed_method, object, *args)
return unless respond_to?(observed_method)
return if disabled_for?(object)
send(observed_method, object, *args)
end
def after_pay(payee, amount)
...
end
И позвони
Payee.notify_observers(:after_pay, payee, amount)
Самая естественная вещь, на мой взгляд, будет иметь модель «Оплата» или «Транзакция», которую вы будете наблюдать вместо этого, поскольку наблюдаемый объект даст вам доступ к связанной учетной записи, Получателю и сумме, d имеют дополнительный бонус наличия бумажного следа для прошлых транзакций. –
Спасибо, Иордания. Ваше предложение очень проницательно, но я не могу изменить это решение в этой ситуации по причинам, не связанным с логикой программирования :) – AdamNYC