ruby-on-rails - 使用常规持久性方法通过 mongoid 更新 Rails 模型的属性

标签 ruby-on-rails ruby mongodb mongoid persistence

我已经追查了一段时间的问题,但仍然无法弄清楚发生了什么。我无法通过正常的持久性方法(例如 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_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 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_namecollection 作为字段将导致 mongoid 发出一些警告。

修复提交:https://github.com/mongodb/mongoid/commit/6831518193321d2cb1642512432a19ec91f4b56d

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

相关文章:

ruby-on-rails - IntelliJ Ultimate 将 Ruby On Rails 检测为 JRuby

arrays - 用于返回电子邮件数组的 Ruby 类方法

mongodb - mongo $sum 在执行 $unwind 然后在多个字段上执行 $group 时复合

ruby-on-rails - 设计模型确认后执行自定义操作

ruby-on-rails - Ruby on Rails 中模型的版本控制

ruby - 将 Ruby 时间转换为 HTML5 全局日期和时间字符串

ruby-on-rails - 使用 link_to 方法将变量发送到 Controller rails 3

javascript - meteor 向现有集合添加新数据

javascript - node.js如何调用mongodb集合getall?

ruby-on-rails - 如何在事件管理菜单中添加超赞字体图标