Mongoid: конвертировать встроенный документ в собственную коллекцию - PullRequest
8 голосов
/ 16 марта 2012

Мне нужно преобразовать встроенный документ в его собственную коллекцию, чтобы на него можно было ссылаться из другой коллекции.

Предположим, у меня есть Parent, который встраивает много Childs. Я думал о чем-то подобном:

Parent.all.each do |p|
 p.childs.all.each do |c|
  c.raw_attributes['parent_id'] = p.id
 end
 p.save! #will save parent and cascade persist all childs onto their own coll
end

Это опция? В идеале я бы запустил это в консоли и изменил бы только отображения mongoid с embed_* на has_*, поэтому мне не нужно было бы изменять остальную часть моего кода или использовать другую коллекцию в качестве промежуточной.

Ответы [ 3 ]

10 голосов
/ 16 марта 2012

Я думаю, код должен выглядеть примерно так (не тестировал)

child_coll = Mongoid.database.collection('children')

Parent.all.each do |p|
  p.childs.all.each do |c|
    c.attributes['parent_id'] = p.id

    child_coll.insert c.attributes # save children to separate collection
  end

  p.childs = nil # remove embedded data
  p.save
end

После этого вы можете изменить embeds_many на has_many и (надеюсь) он должен работать хорошо.

6 голосов
/ 08 января 2013

слишком мало представителей, чтобы комментировать, но я думаю, что ответ Серхио (в противном случае очень полезный) может быть устаревшим.С mongoid 3.0.5 я не мог использовать

child_coll = Mongoid.database.collection('children')

, но вместо этого использовал

child_coll = Mongoid.default_session[:children]

, который помог мне

1 голос
/ 11 октября 2014

Мне нужно удалить атрибут '_id' перед вставкой, в противном случае я получу Дублированный ключ Ошибка.

...