2012-04-04 7 views
0

Ich habe Rake-Aufgaben, die Tausende von Datensätzen aus verschiedenen Quellen und Formaten importieren, und ich versuche, meinen Code nach dem Parsen auszutrocknen, wo sie gerade Modellaufzeichnungen mit dynamischen Suchern find_or_initialize_by_ * erstellen oder aktualisieren .Dynamisch gesetztes dynamisches Finder in Schienen

Im Wesentlichen möchte ich den * Abschnitt der find_or_initialize_by_ * -Methode übergeben können.

Hier ist ein Sudo-Code, um zu erklären, was ich erreichen möchte.

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 

Was ich dann von den Rake Aufgaben mit so etwas wie dies im Produkt Import ...

create_or_update_record('Product', 'product_id',{ 
    "product_id" => "1", 
    "product_price" => "2.99" 
    }) 

und so etwas wie dies in der Kategorie Import ...

create_or_update_record('Category', 'category_id',{ 
    "category_id" => "1", 
    "category_name" => "Gloves" 
    }) 
nennen würde

Ich vermute, ich muss die zugrunde liegende method_missing überschreiben und erweitern. Sieht aus diesem Blogpost, den ich gefunden habe, ziemlich kompliziert aus. http://blog.hasmanythrough.com/2006/8/13/how-dynamic-finders-work

Antwort

1

So etwas wie dies funktionieren würde:

Um

#record = model.find_or_initialize_by_XXX(identifier.to_sym => @identifier_value) 

erstellen Wir werden das dynamische Finder auf das Objekt senden, und die vorhandene Methode fehlt

identifier = "XXX" 
record = model.send("find_or_initialize_by_#{identifier}", identifier.to_sym => @identifier_value) 
+0

dang! Ich brauche offensichtlich mehr Kaffee. Vielen Dank! Arbeitete perfekt. –