我编写了一个方便的 ActiveRecord 扩展来将方法委托给基础对象(基于多表继承)
class ActiveRecord::Base
def self.acts_as(base)
class_eval %Q{
def method_missing(method, *args, &blk;)
#{base}.send(method, *args, &blk;)
rescue NoMethodError
super
end
}
end
end
我有一个state类和一个base类
# state class
class MyState < ActiveRecord::Base
belongs_to :my_object
acts_as :my_object
end
# base class
class MyObject < ActiveRecord::Base
has_one :head, :class_name => 'MyState'
has_one :tail, :class_name => 'MyState'
end
当我尝试这个方法时,我发现它在某些情况下不起作用。进一步来说,
> MyState.first.some_method_in_base
nil
> MyObject.first.tail.some_method_in_base
NoMethodError: undefined method `some_method_in_base' for #<ActiveRecord::Associations::HasOneAssociation:0xABCDEFG>
谁能告诉我为什么一个有效而另一个无效?
当你跑步时MyObject.first.tail
实际响应的对象是关联代理类
删除了大部分基本实例方法,并委托
# 通过未知方法@target
方法缺失
您可以获得有关代理运行的更多详细信息:
MyObject.first.proxy_owner
MyObject.first.proxy_reflection
MyObject.first.proxy_target
如果您查看代码,您可以看到 AssociationProxy 将方法 some_method_in_base 代理到您的 MyState 类only if MyState回应库中的某些方法正如您在下面的代码中看到的。
private
# Forwards any missing method call to the \target.
def method_missing(method, *args, &block)
if load_target
if @target.respond_to?(method)
@target.send(method, *args, &block)
else
super
end
end
end
因此,方法缺失你已经定义在目标类别从未被调用过。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)