Nie sądzę, że jest możliwe (lub ważne) tworzenie kopii istniejącego dokumentu w mongodb/mongomapper, ponieważ wydaje mi się, że wystąpi konflikt dokumentu/dokumentów osadzonych i ich identyfikatorów oryginału i skopiowane dokumenty.
Rozwiązałem więc mój problem, kopiując zawartość dokumentów do nowych dokumentów, a nie samych dokumentów. Oto przykład:
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
To faktycznie zadziałało bardzo dobrze w moim scenariuszu. Ale jestem ciekawy, czy ludzie mają inne rozwiązanie.
Od małego czytania robiłem, mogę zrozumieć, że jedynym sposobem, aby to zrobić jest pętli dokumentów osadzonych w dokumencie macierzystym, uzyskać ich atrybuty, twórz nowe dokumenty, kopiując te atrybuty dla każdego, aż otrzymam kopię dokumentu. Czy ktoś może wymyślić inny sposób? – futureshocked