我已经追查了一段时间了,还是搞不清到底发生了什么事。我无法通过常规的持久化方法(如update或仅仅编辑属性并调用save)编辑从gem生成的文档。
例如,调用:
Scram::Policy.where(id: a.id).first.update!(priority: 12345)
将完全不起作用(没有错误,但文档尚未更新)。但以下方法可以很好地工作:
Scram::Policy.collection.find( { "_id" => a.id } ).update_one( { "$set" => {"priority" => 12345}})
我不知道我做错了什么。在任何其他模型上调用update和save都可以正常工作。有问题的文件来自我的宝石:https://github.com/skreem/scram/blob/master/lib/scram/app/models/policy.rb
我也不能编辑它的嵌入文档(目标)。我试过删除store_in宏,并在一个伪应用程序中使用inverse_ofclass_name指定要使用的类,以重新实现这些类:https://github.com/skreem/scram-implementation/blob/master/lib/scram/lib/scram/app/models/policy.rb
我试过将整个gem重新实现到一个干净的伪rails应用程序中:https://github.com/skreem/scram-implementation
在rails控制台中运行这些命令演示了更新是如何不起作用的:
https://gist.github.com/skreem/c70f9ddcc269e78015dd31c92917fafa
这是Mongoid关于嵌入文档的问题,还是我的代码中缺少了一些小的复杂性?
编辑:
如果从我的gem(scram)的根目录运行irb,然后运行以下命令,则问题仍然存在:

require "scram.rb"
Mongoid.load!('./spec/config/mongoid.yml', :test)

Scram::Policy.first.update!(priority: 32) #=> doesn't update the document at all

Scram::Policy.where(id: "58af256f366a3536f0d54a61").update(priority: 322) #=> works just fine

奇怪的是,以下方法不起作用:
Scram::Policy.where(id: "58af256f366a3536f0d54a61").first.update(priority: 322)
好像没有找回我想要的东西。进行相等性比较表明,第一个文档等于first查询返回的第一个文档。

最佳答案

好。事实证明,不能调用字段collection_name,否则mongoid将确保发生不好的事情。重命名字段就解决了我的所有问题。这是Mongoid中负责冲突的代码:https://github.com/mongodb/mongoid/blob/master/lib/mongoid/persistence_context.rb#L82
这是我宝石中修复我问题的承诺:https://github.com/skreem/scram/commit/25995e955c235b24ac86d389dca59996fc60d822
编辑:
如果您已经解决了这个问题,并且没有收到任何警告,请确保更新您的Mongoid版本!在Mongoid Issue Tracker上创建问题后,persistenceContext被添加到禁止的方法列表中。现在,尝试使用collection_namecollection作为字段将导致Mongoid发出两个警告。
修复提交:https://github.com/mongodb/mongoid/commit/6831518193321d2cb1642512432a19ec91f4b56d

关于ruby-on-rails - 使用常规持久性方法通过mongoid更新Rails模型的属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42423511/

10-09 01:01