0

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

4

1 に答える 1

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)
于 2012-04-04T15:42:30.843 に答える