有没有一种方法可以覆盖实例变量的方法



我在一个名为hash_value的活动记录类中有一个实例变量。这是一个序列化的散列。

我想将散列显示为XML。呼叫hash_value.to_xml正确吗?许多节点都是数字,XML标记不允许只有数字(或以数字开头)。

我想覆盖hash_valueto_xml方法。我不想覆盖所有哈希,只想覆盖此记录中的哈希。

class ProductVersion < ActiveRecord::base
   serialize :hash_value, Hash
   def hash_value.to_xml
   end
end

我在这里尝试了答案,用lambda在一个实例上重新定义了一个ruby方法但它似乎并不适用。我怀疑,因为当我加载记录时,它会创建一个新的hash_value对象,因此对原始对象的单例调整是没有意义的。

任何想法都会很棒。我知道我可以写一个函数hash_value_to_xml,但我宁愿避免做这样的事情。

多亏了第一条评论,我想出了一个解决方案。不是一个好的,但一个有效的。我很想看看是否有更好的方法,因为这个闻起来有点臭。

class MyHash < Hash
    def to_xml
      1/0 #to see if it's run. 
    end
  end
  def hash_value
    MyHash.new().merge(  attributes['hash_value'] );
  end

我会亲自选择hash_value_to_xml路线。但既然你坚持,这里有一个可能有效的想法(尚未测试)

class ProductVersion < ActiveRecord::base
   serialize :hash_value, Hash
   alias_method :old_hash_value, :hash_value
   def hash_value
     h = old_hash_value
     h.define_singleton_method(:to_xml) do
      # your custom xml logic here
     end
     h
   end
end

这个想法是截取从hash_value返回的值并在运行中对其进行修补。

最新更新