Вложенные ссылки не сохраняются из встроенного документа с помощью mongoid - PullRequest
1 голос
/ 06 сентября 2011

Здесь каверзная проблема, касающаяся вложенных документов, ссылок и вложенных документов.Вы можете найти zip-файл, содержащий пример проекта, иллюстрирующий проблему.

Я использую Rails v3.0.9 Mongo v1.8.3 Mongoid v2.2.0

Модели
  • Диалог
  • Сообщение
  • Текст
  • Мультимедиа
  • Ссылка

  • A Сообщение embeds_many Сообщения (автосохранение => true)

  • Сообщение has_many Media (автосохранение => true)
  • Наследование текста от сообщения (STI)
  • Наследование ссылки от ссылки (STI)
  • Разговор accept_nested_attributes_for: messages
  • A accept_nested_attributes_for: medias

В консоли rails проведем некоторое тестирование:

ruby-1.9.2-p180 :001 > c = Conversation.new({:messages_attributes => [{'_type' => 'Text', :content => 'content', :medias_attributes => [{'_type' => 'Link', :url => 'google.com'}]}]})
 => #<Conversation _id: 4e65c7275d156d0129000001, _type: nil, created_at: nil, updated_at: nil, title: nil> 
ruby-1.9.2-p180 :002 > c.messages
 => [#<Message _id: 4e65c7275d156d0129000002, _type: "Text", created_at: nil, updated_at: nil, content: "content">] 
ruby-1.9.2-p180 :003 > c.messages.first.medias
 => [#<Media _id: 4e65c7275d156d0129000003, _type: "Link", created_at: nil, updated_at: nil, message_id: BSON::ObjectId('4e65c7275d156d0129000002'), url: "google.com">] 
ruby-1.9.2-p180 :004 > c.save
 => true 
ruby-1.9.2-p180 :005 > c.reload
 => #<Conversation _id: 4e65c7275d156d0129000001, _type: nil, created_at: 2011-09-06 07:09:33 UTC, updated_at: 2011-09-06 07:09:33 UTC, title: nil> 
ruby-1.9.2-p180 :006 > c.messages
 => [#<Text _id: 4e65c7275d156d0129000002, _type: "Text", created_at: nil, updated_at: nil, content: "content">] 
ruby-1.9.2-p180 :007 > c.messages.first.medias
 => [] #Should not be empty

Теперь, если вы измените отношениямежду разговором <=> Сообщение выглядит следующим образом:

  • Диалог has_many Сообщения

Работает отлично.Некоторые тесты консоли рельсов также:

ruby-1.9.2-p180 :002 > c = Conversation.new({:messages_attributes => [{'_type' => 'Text', :content => 'content', :medias_attributes => [{'_type' => 'Link', :url => 'google.com'}]}]})
 => #<Conversation _id: 4e65c6bb5d156d011a000004, _type: nil, created_at: nil, updated_at: nil, title: nil> 
ruby-1.9.2-p180 :003 > c.messages
 => [#<Message _id: 4e65c6bb5d156d011a000005, _type: "Text", created_at: nil, updated_at: nil, conversation_id: BSON::ObjectId('4e65c6bb5d156d011a000004'), content: "content">] 
ruby-1.9.2-p180 :004 > c.messages.first.medias
 => [#<Media _id: 4e65c6bb5d156d011a000006, _type: "Link", created_at: nil, updated_at: nil, message_id: BSON::ObjectId('4e65c6bb5d156d011a000005'), url: "google.com">] 
ruby-1.9.2-p180 :005 > c.save
 => true 
ruby-1.9.2-p180 :006 > c.reload
 => #<Conversation _id: 4e65c6bb5d156d011a000004, _type: nil, created_at: 2011-09-06 07:07:54 UTC, updated_at: 2011-09-06 07:07:54 UTC, title: nil> 
ruby-1.9.2-p180 :007 > c.messages
 => [#<Text _id: 4e65c6bb5d156d011a000005, _type: "Text", created_at: 2011-09-06 07:07:54 UTC, updated_at: 2011-09-06 07:07:54 UTC, conversation_id: BSON::ObjectId('4e65c6bb5d156d011a000004'), content: "content">] 
ruby-1.9.2-p180 :008 > c.messages.first.medias
 => [#<Link _id: 4e65c6bb5d156d011a000006, _type: "Link", created_at: 2011-09-06 07:07:54 UTC, updated_at: 2011-09-06 07:07:54 UTC, message_id: BSON::ObjectId('4e65c6bb5d156d011a000005'), url: "google.com">]

Вот ссылка на образец zip-файла: http://d.pr/oMUc

1 Ответ

1 голос
/ 12 сентября 2011

Ну, не все так просто на этом ^^

Однако вот ссылка на проблему git для mongoid: https://github.com/mongoid/mongoid/issues/1216

Для тех, у кого такая же проблема!

...