我在一个名为hash_value
的活动记录类中有一个实例变量。这是一个序列化的散列。
我想将散列显示为XML。呼叫hash_value.to_xml
正确吗?许多节点都是数字,XML标记不允许只有数字(或以数字开头)。
我想覆盖hash_value
的to_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
返回的值并在运行中对其进行修补。