Я пытаюсь реализовать шаблон цепочки ответственности в Ruby и ActiveRecord для полиморфного объекта. У меня есть несколько проблем.
- Иногда я получаю сообщение об ошибке, что метод не определен, когда я пытаюсь использовать alias_method, я думаю, это потому, что класс не загружен или что-то в этом роде, поэтому я явно делаю отправку, чтобы получить метод
- Я получаю кучу бесконечных цепочек, где функция с псевдонимом (original_method) вызывает метод, который вызывает original_method. Мне интересно, потому ли это, что когда вы используете псевдоним для метода, который уже был перезаписан, вы, по сути, делаете "original_method" копию метода с псевдонимом.
- В настоящее время я работаю над этим, имея такую функцию, как «цепочка», возвращающую подкласс Setting со всеми определенными методами, но любопытно, почему было так много проблем с alias_method прямо в классе.
Вот пример:
class Hospital
has_one :setting, :as => :settable
belongs_to :administrative_area
def next_link
adminstrative_area
end
def usable_setting
setting ? setting : next_link.usable_setting
end
end
Затем у меня есть объект Setting:
class Setting < ActiveRecord::Base
belongs_to :settable, :polymorphic => true
def chained
%w(api_key active_days).each do |method|
# this is here because otherwise the method isn't defined,
# it's almost as while it's going up, the metaclass doesn't have the columns
# until it loads, probably will be fixed if we cache classes
self.send method.to_sym
(class << self; self; end).class_eval do
define_method method do |*args|
alias_method "original_#{method}", method
my_setting = send("original_#{method}")
if my_setting.nil? or my_setting.empty?
settable.next_link.usable_setting.chained.send(method)
else
return my_setting
end
end
end
end
self
end
end