2015-08-19 2 views
0

У меня есть такая модель.Mongoid: embeds_one и _destroy param во встроенных документах

class Article 
     include Mongoid::Document   
     embeds_many :blocks, class_name: 'Article::Block', cascade_callbacks: true 
     accepts_nested_attributes_for :blocks, allow_destroy: true 
     ... 

     class Block 
     include Mongoid::Document 
     embedded_in :article 
     embeds_one :squib, class_name:'Article::Block::Squib', cascade_callbacks: true 
     accepts_nested_attributes_for :squib, allow_destroy: true    
     ... 

     class Squib 
      include Mongoid::Document 
      ... 
      embedded_in :block, class_name: 'Article::Block' 
     end 
     end 
    end 

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

{"article"=>{"_id"=>"55d4c8a43a98c118b100001a", ... , "blocks_attributes"=>[{... "squib_attributes"=>{... "_destroy"=>1, "_id"=>"55d4ccb63a98c118b1000044"}, "_id"=>"55d4c8d73a98c118b100001c"}]}} 

Вложенная статья :: Блок :: Squib не разрушает. Нет проблем, когда я использую отношение embeds_many. Проблема только в embeds_one.

Как это исправить?

Mongoid версия 4.0.2

+0

У вас есть спецификация/тест, подтверждающий эту ошибку? В этом случае, возможно, вы должны создать проблему с Mongoid. – max

+0

Большое спасибо за комментарий. Я сделал простой пример с тестами: https://github.com/r00takaspin/mongoid-test. Но я нашел решение в источниках и добавил его в качестве своего собственного ответа. Это ошибка или функция? :) –

ответ

0

Я нашел решение в источниках mongoid. Существует код с проверкой на embeds_one соотношение:

def delete? 
     destroyable? && !attributes[:id].nil? 
    end 

Mongoid-4.0.2/Библиотека/Mongoid/отношения/строители/nested_attributes/one.rb: 82

Это означает, что embeds_one понимает только : идентификатор идентификатор документа, а не embeds_many, который позволяет передавать внедренные документы с : _id doc identifier.

Вместо:

{ "статьи" => { "_ ид" => "55d4c8a43a98c118b100001a", ..., "blocks_attributes" => [{... "squib_attributes" => { ... "_destroy" => 1, "_id "=>" 55d4ccb63a98c118b1000044"}, "_id" => "55d4c8d73a98c118b100001c"}]}}

вы должны пройти

{"article" => {"_ id" => "55d4c8a43a98c118b100001a", ..., "blocks_attributes" => [{... "squib_attributes" => {... "_destroy" => 1, "ID "=>" 55d4ccb63a98c118b1000044"}, "_id" => "55d4c8d73a98c118b100001c"}]}}

к update_attributes метод.

Смежные вопросы