Ruby on rails 可能具有不同类型mongoid的字段
在我的模型中,我有Ruby on rails 可能具有不同类型mongoid的字段,ruby-on-rails,ruby,mongodb,mongoid,Ruby On Rails,Ruby,Mongodb,Mongoid,在我的模型中,我有 field :is_open, type: Time, default: nil 然而,在之前的同一个模型中,我将此类型存储为布尔值。我现在想把它改成键入时间。对于数据库中的新项,这很好,但是对于旧记录,当我尝试访问此属性时,它仍然存储为布尔值 modelInstance.is_open 我得到以下错误: #<NoMethodError: undefined method `getlocal' for true:TrueClass> #不必使用Mongoid
field :is_open, type: Time, default: nil
然而,在之前的同一个模型中,我将此类型存储为布尔值。我现在想把它改成键入时间。对于数据库中的新项,这很好,但是对于旧记录,当我尝试访问此属性时,它仍然存储为布尔值
modelInstance.is_open
我得到以下错误:
#<NoMethodError: undefined method `getlocal' for true:TrueClass>
#不必使用Mongoid指定字段类型。这意味着你可以这样做:
class Model
include Mongoid::Document
field :f
end
> db.models.find()
{ "_id" : ObjectId(...), "f" : true }
{ "_id" : ObjectId(...), "f" : 6 }
{ "_id" : ObjectId(...), "f" : "pancakes" }
有这样的数据:
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"
因此,您可以从字段
中删除:键入
,一切正常。当然,如果您在等待修复MongoDB数据时需要进行某种手动类型转换或检查,您可能需要提供自己的def is_open
和def is_open=
方法。为什么不想修复MongoDB内部的问题?最终我将编写一个迁移脚本,但是现在我不能更改数据库的格式。@是的,但这违反了“不能更改数据库格式”的限制,不是吗?