2014-09-01 4 views
2

При сохранении документов с 3-мя уровнями вложенности, дочерние объекты сохраняются при неправильном родителю:Mongoid: Встроенные документы сохраняются при неправильном родителю

user = User.create 
website = user.websites.create 
post = website.posts.create 
post2 = website.posts.create 

post.images.create 
post2.images.create 

puts "#{user.to_json}" 
puts "#{user.reload.to_json}" 

Каждый пост должен иметь изображение, что правда на грязный пользовательский объект (user.to_json) =>https://gist.github.com/vdaubry/cdc465d6d5ef84576830

Но когда я перезагрузить пользователь всех изображения внедренные под первым постом (user.reload.to_json) =>https://gist.github.com/vdaubry/a9c217a467dd9ff9a7fb

Является ли это ошибкой или я упускаю что-то очевидное?

Вот определение класса используется для воспроизведения этого:

class User 
    include Mongoid::Document 
    embeds_many :websites 
end 

class Website 
    include Mongoid::Document 
    include Mongoid::Timestamps 
    embedded_in :user 
    embeds_many :posts 

end 

class Post 
    include Mongoid::Document 
    include Mongoid::Timestamps 

    embedded_in :website 
    embeds_many :images 
end 
class Image 
    include Mongoid::Document 
    include Mongoid::Timestamps 
    embedded_in :post 
end 

Мой Gemfile:

ruby 2.1.2p95 
gem 'rails', '~> 4.1.4' 
gem 'mongoid', '~> 4.0.0' 

ответ

1

Это ошибка, я не уверен, на котором заканчивается ошибка существует, Mongoid или MongoDB , Это происходит потому, что Mongoid заменяет индекс в ключе поля, на которое мы нажимаем оператор позиционирования «$», т. Е. «Website.0.posts.1.images» изменен на «websites.0.posts. $. изображений".

Цитирование документации на позиционном операторе (курсив мой):

При использовании методы обновления(),

  • позиционных $ оператор выступает в качестве заполнителя для первых элемент , который соответствует документ запроса,

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

Я не уверен, почему Mongoid делает это (заменяя позиционным оператором) или это необходимо для операции $push.

Я вижу, что вы уже создали проблему для них, поэтому я тоже копирую свои комментарии.

0

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

Я реорганизовал свою модель, чтобы вставить только 2 уровня сбора. Он работает с:

class User 
    include Mongoid::Document 
    has_many :websites 
end 

class Website 
    belongs_to :user 
    embeds_many :posts 
end 

class Post 
    embedded_in :website 
    embeds_many :images 
end 

class Image 
    embedded_in :post 
end 

Я думаю, что лучший способ, чтобы получить эту работу является upvoting основного вопроса непосредственно на Монго JIRA:

https://jira.mongodb.org/browse/SERVER-831