【问题标题】:Renaming field in Mongoid does not update field in class在 Mongoid 中重命名字段不会更新类中的字段
【发布时间】:2019-04-29 18:20:42
【问题描述】:

当我在 Mongoid 中重命名一个字段时,它成功更新了 MongoDB 中的字段,但它没有更新 ruby​​ 代码中的字段:

class Example
  include Mongoid::Document
  field :apple, type: String, as: :c_apple
end

Example.all
 => #<Mongoid::Criteria
  selector: {}
  options:  {}
  class:    Example
  embedded: false>

Example.all.rename("apple" => "d_apple")
  MOPED: 127.0.0.1:27017 UPDATE       database=core collection=examples selector={} update={"$rename"=>{"apple"=>"d_apple"}} flags=[:multi]
                         COMMAND      database=core command={:getlasterror=>1, :w=>1} runtime: 1.2460ms
 => {"connectionId"=>2, "updatedExisting"=>false, "n"=>0, "syncMillis"=>0, "writtenTo"=>nil, "err"=>nil, "ok"=>1.0} 

e = Example.new
 => #<Example _id: 5bfdbf103ed1492f9a000001, apple(c_apple): nil> 

 e.d_apple
NoMethodError: undefined method `d_apple' for #<Example _id: 5bfdbf103ed1492f9a000001, apple(c_apple): nil>

为什么 MongoDB 中的更改没有反映在类定义中?

【问题讨论】:

  • “但它不会更新 ruby​​ 代码中的字段”——事实上,这根本不是这个方法应该做的。

标签: ruby-on-rails ruby mongodb mongoid


【解决方案1】:

当您运行 #rename 时,您将与 MongoDB 进行交互。文档结构的变化存储在数据库中。该方法不与 ruby​​ 源代码交互,需要自行编辑。

顺便说一句。我不记得与存储在文件中的源代码交互的任何 ruby​​/rails 方法(除了 rake 任务和生成器中的方法)。

【讨论】:

  • 我需要使用class_eval打开类并修改代码,然后动态重新加载文档
  • 为什么要动态做呢?您可以在源代码中重命名它,然后重新加载应用程序。顺便说一句,在生产设置中,复制字段内容而不是重命名它更安全。
  • 我需要动态执行,因为字段名称是基于用户输入的。
  • 那么您想根据用户输入重命名数据库中的字段吗?相当冒险,我假设您正在做一个 mongo 管理工具。
  • @Donato:如果您正在制作数据库管理工具,那么 mongoid 对您毫无用处。正是因为您事先不知道架构并且(我假设)根本不关心关系。您最好的做法(恕我直言)是使用“原始”mongo 驱动程序。
猜你喜欢
  • 1970-01-01
  • 2019-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-24
  • 2012-12-28
  • 1970-01-01
相关资源
最近更新 更多