いくつかの異なるソースと形式から数千のレコードをインポートする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