Mongoid:嵌入文档中的 embeds_one 和 _destroy 参数

Mongoid: embeds_one and _destroy param at embedded documents

我有这样的模型

    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"}]}} 

嵌入式Article::Block::Squib不破坏。当我使用 embeds_many 关系时没有问题。问题仅在 embeds_one.

如何解决?

Mongoid 版本 4.0.2

我在 mongoid 资源中找到了解决方案。有检查 embeds_one 关系的代码:

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

mongoid-4.0.2/lib/mongoid/relations/builders/nested_attributes/one.rb:82

这意味着 embeds_one 只理解 :id 文档标识符,而不是 embeds_many,这允许您使用 [=25= 传递嵌入文档]:_id 文档标识符。

而不是:

{"article"=>{"_id"=>"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方法。