Я бы сказал: «Да, это грязно». Ваше намерение состоит не в том, чтобы изменить поведение метода 'destroy', а в том, чтобы выполнить некоторую работу с доменом, а затем запустить destroy
. Ваш первый подход великолепен - определите метод, который делает то, что вы хотите, и при необходимости вызывайте destroy
. Я думаю, что «обертывание» или «исправление обезьяны» метод, как вы думаете, это метод, который лучше всего применять, когда нельзя использовать стандартные подходы ОО - например, когда вам нужно изменить / дополнить поведение в класс, который определен и используется вне вашей области контроля.
Даже если вы рассматриваете вопрос об изменении поведения самого метода destroy
, я бы предложил переопределить метод здесь, а не оборачивать его:
def destroy(options = {})
restock_products if options['restock']
super() # I think parens are necessary here, to avoid passing options up the chain
end