-1

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

我想将哈希显示为 XML。打电话合适hash_value.to_xml吗?很多节点都是数字,XML标签不允许只有数字(或以数字开头)。

我想覆盖to_xml. hash_value我不想覆盖所有散列,只是这条记录中的散列。

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
4

1 回答 1

1

我会亲自去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并即时修补它。

于 2013-06-27T06:58:47.667 回答