ruby-on-rails - 具有可能不同类型 mongoid 的字段

标签 ruby-on-rails ruby mongodb mongoid

在我的模型中我有

field :is_open, type: Time, default: nil

但是之前在同一模型中,我将此类型存储为 bool 值。我现在想将其更改为键入时间。对于我数据库中的新项目,这工作正常,但是对于仍然存储为 bool 值的旧记录,当我尝试访问此属性时

modelInstance.is_open

我收到以下错误:

#<NoMethodError: undefined method `getlocal' for true:TrueClass>

不是将我的 mongo 数据库中的所有 bool 值更改为 Time 对象,有没有一种方法/ Hook 我可以在 mongo 上做,这样当从文档中提取这个属性时,我可以检查它是否是一个 bool 值并将其替换为时间戳?

最佳答案

您不必使用 Mongoid 指定字段类型。这意味着您可以执行以下操作:

class Model
  include Mongoid::Document
  field :f
end

像这样的数据:

> db.models.find()
{ "_id" : ObjectId(...), "f" : true }
{ "_id" : ObjectId(...), "f" : 6 }
{ "_id" : ObjectId(...), "f" : "pancakes" }

一切都会好起来的:

rails > Model.all.map { |m| puts "#{m.f.class} - #{m.f.inspect}" }
TrueClass - true
Float - 6.0
String - "pancakes"

因此,您可以从字段 中删除:type,一切都会正常进行。当然,如果您需要在等待时进行某种手动类型转换或检查,您可能希望提供自己的 def is_opendef is_open= 方法修复您的 MongoDB 数据。

关于ruby-on-rails - 具有可能不同类型 mongoid 的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25926137/

相关文章:

node.js - 更新 Mongoose 模式中的动态字段

ruby-on-rails - 为什么 Rails 孤儿通过关联加入多态记录?

css - 如何最好地在 Rails 应用程序中组织 Assets

ruby - 如何在 Ruby 进程中捕获信号

ruby-on-rails - RSpec 生成请求规范而不是 Controller 规范

Ruby - 多线程 TCP 消息

ruby-on-rails - 从/lib 目录中定义的类访问 ActionView::Helpers::DateHelper

ruby-on-rails - devise的sign_in是做什么的

mongodb - 带有可选参数的 MongoDB runCommand 引用

java - 未分类的MongoDbException : Command failed with error 10107 (NotMaster): 'not master' on server