我正在尝试在 Ruby 和 ActiveRecord 中为多态对象实现责任链模式。我有几个问题。
- 有时我在尝试 alias_method 时收到一个方法未定义的错误,我认为这是因为未加载类或其他原因,所以我明确地发送来获取方法
- 我得到一堆无限链,其中别名函数(original_method)调用调用 original_method 的方法。我想知道这是否是因为当您为已被覆盖的方法设置别名时,您实质上是在使“original_method”成为别名方法的副本。
- 我目前正在通过让像“chained”这样的函数返回具有所有已定义方法的 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
然后,我有一个设置对象:
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