У меня была похожая проблема с необходимостью переопределить «пользовательский» сеттер для отношения отношение к пользователю. Я придумал это решение не только для этого случая, но и для упаковки любого метода, уже определенного в том же классе.
class Class
def wrap_method(name, &block)
existing = self.instance_method(name)
define_method name do |*args|
instance_exec(*args, existing ? existing.bind(self) : nil, &block)
end
end
Это позволяет вам делать следующее в классе вашей модели:
wrap_method :user= do |value, wrapped|
wrapped.call(value)
#additional logic here
end