gpt4 book ai didi

ruby-on-rails - method_missing 覆盖不起作用

转载 作者:数据小太阳 更新时间:2023-10-29 07:31:14 26 4
gpt4 key购买 nike

我写了一个方便的 ActiveRecord 扩展来将方法委托(delegate)给一个基础对象(基于 multi-table inheritance)

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    }  endend

我有一个state类和一个base

# state classclass MyState < ActiveRecord::Base  belongs_to :my_object  acts_as :my_objectend# base classclass MyObject < ActiveRecord::Base  has_one :head, :class_name => 'MyState'  has_one :tail, :class_name => 'MyState'end

当我尝试这个时,我发现它在某些情况下不起作用。更具体地说,

> MyState.first.some_method_in_basenil> MyObject.first.tail.some_method_in_baseNoMethodError: undefined method `some_method_in_base' for #<ActiveRecord::Associations::HasOneAssociation:0xABCDEFG>

谁能告诉我为什么一个有效而另一个无效?

最佳答案

当您运行 MyObject.first.tail 时,实际响应的对象是一个 AssociationProxy。类

has most of the basic instance methods removed, and delegates # unknown methods to @target via method_missing

您可以获得有关正在运行的代理的更多详细信息:

MyObject.first.proxy_owner
MyObject.first.proxy_reflection
MyObject.first.proxy_target

如果您查看代码,您可以看到 AssociationProxy 将方法 some_method_in_base 代理到您的 MyState 类仅当 MyState 响应some_method_in_base 如您在下面的代码中所见。

  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

因此,永远不会调用您在目标类 中定义的method_missing

关于ruby-on-rails - method_missing 覆盖不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3386567/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com