我已经追查了一段时间的问题,但仍然无法弄清楚发生了什么。我无法通过正常的持久性方法(例如 update
)编辑由我的 gem 生成的文档,甚至无法编辑属性并调用 save
。
例如调用:
Scram::Policy.where(id: a.id).first.update!(优先级:12345)
根本不起作用(没有错误,但文档尚未更新)。但以下将正常工作:
Scram::Policy.collection.find( { "_id"=> a.id } ).update_one( { "$set"=> {"priority"=> 12345}})
我不确定我做错了什么。在任何其他模型上调用更新和保存都可以正常工作。有问题的文档来 self 的 gem:https://github.com/skreem/scram/blob/master/lib/scram/app/models/policy.rb
我也无法编辑其嵌入文档(目标)。我尝试删除 store_in
宏,并在一个假应用程序中使用 inverse_of
和 class_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 console 中运行这些演示了更新是如何不起作用的: 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
似乎没有检索到我想要的内容。进行相等比较表明第一个文档等于 where
查询返回的第一个文档。
最佳答案
嗯。事实证明,你不能调用一个字段 collection_name
否则 mongoid 将确保坏事发生在你身上。只需重命名该字段即可解决我所有的问题。这是导致碰撞的 mongoid 中的代码:https://github.com/mongodb/mongoid/blob/master/lib/mongoid/persistence_context.rb#L82
这是我的 gem 中修复我的问题的提交:https://github.com/skreem/scram/commit/25995e955c235b24ac86d389dca59996fc60d822
编辑:
如果您已经处理了这个问题并且没有收到任何警告,请确保更新您的 Mongoid 版本!在 mongoid 问题跟踪器上创建问题后,PersistenceContext 被添加到禁止方法列表中。现在,尝试使用 collection_name
或 collection
作为字段将导致 mongoid 发出一些警告。
修复提交:https://github.com/mongodb/mongoid/commit/6831518193321d2cb1642512432a19ec91f4b56d
关于ruby-on-rails - 使用常规持久性方法通过 mongoid 更新 Rails 模型的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42423511/