Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 可能具有不同类型mongoid的字段_Ruby On Rails_Ruby_Mongodb_Mongoid - Fatal编程技术网

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内部的问题?最终我将编写一个迁移脚本,但是现在我不能更改数据库的格式。@是的,但这违反了“不能更改数据库格式”的限制,不是吗?