我正在使用DelayedJob,我需要覆盖从YAML反序列化对象时我正在使用的思想的方法:self.yaml_new
(在{{1}中定义})
我的印象是,当YAML对某些数据进行反序列化时,它会在该数据类型的类上调用delayed/serialization/active_record
方法
DJ的yaml_new
方法使用传入的内容
我无法使用自己的类实现此行为。当我在一个类上设置yaml_new
方法并在序列化实例上尝试self.yaml_new
时,它似乎不会调用YAML.load
所以我显然必须弄错。
这种方法的用途是什么?
搜索yaml_new
并不会产生太大影响(仅使用其他人的API文档)。所以我想知道这个方法到底是什么。
我认为yaml_new
是一个钩子方法,当找到某个类型的对象时,如果该方法存在于该类中,则会调用该方法。但我再也无法让它发挥作用。以下是一个示例:
yaml_new
更新
因此,在我的Rails应用程序中玩游戏后,class B
def self.yaml_new(klass, tag, val)
puts "I'm in yaml new!"
end
end
b = B.new
YAML.load b.to_yaml # expected "I'm in yaml new!" got nothing
实际上从yaml_new
调用了。我有一个文件就像这样:
YAML.load
除了我正在记录动作之外,这正是DJ所做的。
module ActiveRecord
class Base
def self.yaml_new(klass, tag, val)
puts "\n\n yaml_new!!!\n\n"
klass.find(val['attributes']['id'])
rescue ActiveRecord::RecordNotFound
raise Delayed::DeserializationError
end
def to_yaml_properties
['@attributes', '@database'] # add in database attribute for serialization
end
end
end
我实际上得到了记录的输出!!
那么我在Rails应用程序之外做错了什么?有没有其他方法让这个方法触发?我问,因为我试图在我自己的gem中测试它并且YAML.load Contact.first.to_yaml
# => yaml_new!!!
方法没有触发,所以我的测试失败了,但它确实在Rails中工作
答案 0 :(得分:0)
您需要添加类似
的内容yaml_as "tag:ruby.yaml.org,2002:B"
在定义self.yaml_new
方法之前。根据yaml / tag.rb中的评论,yaml_as:
将taguri 标记添加到类中,在转储或加载类时使用 在YAML。有关键入和输入的详细信息,请参阅YAML :: tag_class taguris。