【发布时间】:2017-02-23 18:30:13
【问题描述】:
我一直在追查一个问题,但仍然无法弄清楚发生了什么。我无法通过正常的持久性方法(如update)编辑由我的 gem 制作的文档,甚至无法编辑属性并调用save。
例如调用:
Scram::Policy.where(id: a.id).first.update!(priority: 12345)
根本不起作用(没有错误,但文档尚未更新)。但以下将正常工作:
Scram::Policy.collection.find( { "_id" => a.id } ).update_one( { "$set" => {"priority" => 12345}})
我不确定我做错了什么。在任何其他模型上调用更新和保存都可以正常工作。有问题的文档来自我的 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 控制台中运行这些程序演示了更新是如何不起作用的: 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 查询返回的第一个文档。
【问题讨论】:
标签: ruby-on-rails ruby mongodb mongoid persistence