Mongomapper: скопируйте документ в новый документ

У меня есть документ mongomapper со встроенными документами, и я хочу сделать его копию.

По сути, я пытаюсь сделать что-то вроде этого:

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

Итак, я хочу получить два разных документа mongomapper, но с одинаковым содержанием.

Есть идеи, как это сделать?


person futureshocked    schedule 09.03.2011    source источник
comment
Из небольшого чтения, которое я сделал, я понял, что единственный способ сделать это - просмотреть встроенные документы в родительском документе, получить их атрибуты, создать новые документы, скопировав эти атрибуты для каждого, пока у меня не будет копия. документа. Кто-нибудь может придумать другой способ?   -  person futureshocked    schedule 09.03.2011


Ответы (3)


Для этого вам нужно изменить _id. Предполагается, что документы с одинаковым _id являются одним и тем же документом, поэтому при сохранении документа с другим _id будет создан новый документ.

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

В стороне, я был бы склонен хранить старую _id где-нибудь в новой записи, чтобы я мог отслеживать, кто от кого произошел, но в этом нет необходимости.

person John F. Miller    schedule 21.03.2011
comment
Отлично, я вижу, как я могу совместить создание вами новых идентификаторов с тем, как я работаю со встроенными документами, то есть дать новым копиям документа и его встроенным документам их новые идентификаторы. - person futureshocked; 23.03.2011

Вы должны просто уметь это делать:

duplicate_doc = doc.clone
duplicate_doc.save
person Kevin Rood    schedule 15.11.2011

Я не думаю, что возможно (или допустимо) создавать копии существующего документа в mongodb / mongomapper, потому что мне кажется, что произойдет столкновение документа / встроенных документов и их идентификаторов исходных и скопированных документов.

Итак, я решил свою проблему, скопировав содержимое документов в новые документы, а не сами документы. Вот образец:

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

Это действительно очень хорошо сработало в моем сценарии. Но мне любопытно, есть ли у людей другое решение.

person futureshocked    schedule 10.03.2011