2011-03-09 32 views
5

Ho un documento di mongomapper con documenti incorporati e voglio fare una copia di esso.Mongomapper: copia un documento in un nuovo documento

In sostanza, quello che sto cercando di fare è qualcosa di simile:

customer = Customer.find(params[:id]) 
new_customer = Customer.new 
new_customer = customer 
new_customer.save 

quindi voglio finire con due diversi documenti MongoMapper, ma con contenuto identico.

Qualche idea su come dovrebbe essere fatto?

+0

Da un po 'di lettura che ho fatto, ho dato l'unico modo per farlo è quello di un ciclo tra i documenti incorporati nel documento genitore, ottenere la loro attributi, creare nuovi documenti copiando questi attributi per ciascuno di essi, fino a quando non ho una copia del documento. Qualcuno può pensare in un altro modo? – futureshocked

risposta

4

Per fare ciò, è necessario modificare _id. Si presume che i documenti con lo stesso _id siano lo stesso documento, pertanto il salvataggio di un documento con un diverso _id creerà un nuovo documento.

customer = Customer.find(params[:id]) 
customer._id = BSON::ObjectId.new # Change _id to make a new record 
    # NOTE: customer will now persist as a new document like the new_document 
    # described in the question. 
customer.save # Save the new object 

Per inciso, sarei propenso a conservare il vecchio _id da qualche parte nel nuovo record in modo da poter tenere traccia di chi derivato da chi, ma non è necessario.

+0

Bello, vedo come posso combinare la creazione di nuovi ID con il modo in cui gestisco i documenti incorporati, ovvero fornire nuove copie del documento e dei relativi documenti incorporati ai nuovi ID. – futureshocked

0

non credo sia possibile (o valido) per creare copie di un documento esistente in MongoDB/MongoMapper perché mi sembra che ci sarebbe stato uno scontro dei documenti documento/embedded ei relativi ID dell'originale e documenti copiati.

Così ho risolto il mio problema copiando il contenuto dei documenti in nuovi documenti, piuttosto che i documenti stessi. Ecco un esempio:

inspection = Inspection.find(params[:inspection_id]) #old document 
new_inspection = Inspection.create     #new target document 
items = inspection.items        #get the embedded documents from inspection 

items.each do |item|         #iterate through embedded documents 
    new_item = Item.create       #create a new embedded document in which 
                 # to copy the contents of the old embedded document 
    new_item.area_comment = item.area_comment   #Copy contents of old doc into new doc 
    new_item.area_name = item.area_name 
    new_item.area_status = item.area_status 
    new_item.clean = item.clean 
    new_item.save          #Save new document, it now has the data of the original 
    new_inspection.items << new_item     #Embed the new document into its parent 
    end 

new_inspection.save         #Save the new document, its data are a copy of the data in the original document 

Questo in realtà ha funzionato molto bene nel mio scenario. Ma sono curioso di sapere se le persone hanno una soluzione diversa.

4

Si dovrebbe semplicemente essere in grado di fare questo:

duplicate_doc = doc.clone 
duplicate_doc.save 
Problemi correlati