我有rake任务从几个不同的源和格式导入数千条记录,我想在解析之后干掉我的代码,他们当前使用find_or_initialize_by_ *动态查找器创建或更新模型记录。
基本上,我希望能够传入find_or_initialize_by_ *方法的*部分。
这是一些sudo代码,可以尝试解释我想要实现的目标。
def create_or_update_record(*args)
model = args[0].classify.constantize
identifier = args[1]
attributes = args.extract_options!
XXX = identifier
record = model.find_or_initialize_by_XXX(identifier.to_sym => @identifier_value)
attributes.each do |attribute|
#set value of attribute here
end
record.save
end
然后,我将在产品导入中使用rake任务调用这些内容......
create_or_update_record('Product', 'product_id',{
"product_id" => "1",
"product_price" => "2.99"
})
和类别导入中的类似内容...
create_or_update_record('Category', 'category_id',{
"category_id" => "1",
"category_name" => "Gloves"
})
我猜我需要覆盖并扩展底层的method_missing。从我发现的这篇博文中看起来相当复杂。 http://blog.hasmanythrough.com/2006/8/13/how-dynamic-finders-work
答案 0 :(得分:1)
这样的事情会起作用:
创建
#record = model.find_or_initialize_by_XXX(identifier.to_sym => @identifier_value)
我们将动态查找器发送到对象,并使用现有方法缺失
identifier = "XXX"
record = model.send("find_or_initialize_by_#{identifier}", identifier.to_sym => @identifier_value)