У нас есть две модели Rails: Person
и Administrator
.Мы запрещаем удаление Administrator
s на уровне модели:
class Person < ActiveRecord::Base
end
class Administrator < Person
def destroy
raise "Can't remove administrators."
end
end
me = Administrator.new
me.destroy # raises an exception
Я хотел бы иметь возможность обойти это во время тестирования, но только для конкретных экземпляров, созданных во время установки и демонтажа.Я не хочу менять поведение класса, поэтому class_eval
и remove_method
невозможны.
Я попытался переопределить метод #destroy
фактического экземпляра:
def me.destroy
super
end
или переопределите его в классе синглтона:
class << me
def destroy
super
end
end
, но все же возникло исключение.Я не мог понять, как заставить его вызывать метод суперкласса неявно.Я закончил тем, что создал свой собственный метод destroy!
(так как на самом деле это не метод в ActiveRecord), который как бы нарушает мое желание не изменять поведение класса:
def destroy!
ActiveRecord::Persistence.instance_method(:destroy).bind(self).call
end
Есть ли простой способсказать одному экземпляру метода вызвать его метод суперкласса?
Окончательный ответ: На основании статьи, на которую только что ссылался Хольгер, я смог просто явно вызвать метод суперкласса:
def me.destroy
self.class.superclass.instance_method(:destroy).bind(self).call
end