有没有办法覆盖实例变量的方法

时间:2013-06-27 06:47:31

标签: ruby-on-rails ruby override instance

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

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

我想覆盖to_xml的{​​{1}}方法。我不想覆盖所有哈希值,只是覆盖此记录中的哈希值。

hash_value

我在这里尝试了答案redefining a single ruby method on a single instance with a lambda 但似乎并不适用。我怀疑是因为当我加载记录时,它会创建一个新的class ProductVersion < ActiveRecord::base serialize :hash_value, Hash def hash_value.to_xml end end 对象,因此原始单调调整没有实际意义。

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

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

hash_value

1 个答案:

答案 0 :(得分: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返回的值并动态修补它。