ruby-on-rails – 使用Mongoid更新嵌入文档会更新父文档
发布时间:2020-12-17 03:21:47 所属栏目:百科 来源:网络整理
导读:当我尝试更新嵌入文档的属性(embeds_many)时,mongoid无法保存更改,并且奇怪地将更改的属性添加为父文档的新属性.这是一个简单的单元测试,说明了我要做的事情: class Tab include Mongoid::Document field :name,:type = String embeds_many :components,:cl
当我尝试更新嵌入文档的属性(embeds_many)时,mongoid无法保存更改,并且奇怪地将更改的属性添加为父文档的新属性.这是一个简单的单元测试,说明了我要做的事情:
class Tab include Mongoid::Document field :name,:type => String embeds_many :components,:class_name => 'TabComponent' end class TabComponent include Mongoid::Document embeds_many :components,:class_name => "TabComponent" end class TabColumn < TabComponent field :width,:type => Integer end require 'test_helper' class TabTest < ActiveSupport::TestCase test "create new tab" do tab = Tab.new({ :name => "My Demo Tab",:components => [TabColumn.new({ :width => 200 })] }) tab.save! tab.components[0].width = 300 tab.save! assert_equal tab.components[0].width,300 # passes tab.reload assert_equal tab.components[0].width,300 # fails! end end 这是日志输出: MONGODB (39ms) beam_test['system.namespaces'].find({}) MONGODB (27ms) beam_test['$cmd'].find({"count"=>"tabs","query"=>{},"fields"=>nil}).limit(-1) MONGODB (38ms) beam_test['tabs'].find({}) MONGODB (0ms) beam_test['tabs'].remove({:_id=>BSON::ObjectId('4fb153c4c7597fbdac000002')}) MONGODB (0ms) beam_test['tabs'].insert([{"_id"=>BSON::ObjectId('4fb15404c7597fccb4000002'),"name"=>"My Demo Tab","components"=>[{"_id"=>BSON::ObjectId('4fb15404c7597fccb4000001'),"_type"=>"TabColumn","width"=>200}]}]) MONGODB (0ms) beam_test['tabs'].update({"_id"=>BSON::ObjectId('4fb15404c7597fccb4000002')},{"$set"=>{"width"=>300}}) MONGODB (27ms) beam_test['tabs'].find({:_id=>BSON::ObjectId('4fb15404c7597fccb4000002')}).limit(-1) 难道我做错了什么?请注意,我不认为问题是多态,如果我通过在TabComponent上放宽来简化事情,则会观察到相同的行为. 解决方法
您的关系中有一个简单的错误,而是使用以下内容来完成embeds_many / embedded-in关系的对称性.
class TabComponent include Mongoid::Document embedded_in :tab end 在上面的日志输出中,您会看到: MONGODB (0ms) beam_test['tabs'].update({"_id"=>BSON::ObjectId('4fb15404c7597fccb4000002')},{"$set"=>{"width"=>300}}) 经过上述修复后,我现在得到: MONGODB (0ms) free11819_mongoid_embedded_update_test['tabs'].update({"_id"=>BSON::ObjectId('4fb270fee4d30bbc20000002')},{"$set"=>{"components.0.width"=>300}}) 请注意差异宽度与components.0.width的关系. 希望这有助于您的工作. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |