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方法。
我有这样的模型
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方法。