在我的模型中我有
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_open
和 def is_open=
方法修复您的 MongoDB 数据。
关于ruby-on-rails - 具有可能不同类型 mongoid 的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25926137/