在我的模特中我有
field :is_open, type: Time, default: nil
但是之前在同一个模型中,我将此类型存储为布尔值。我现在想把它改成类型时间。对于我的数据库中的新项目,这可以正常工作,但对于旧记录,当我尝试访问此属性时,它仍然存储为布尔值
modelInstance.is_open
我收到以下错误:
#<NoMethodError: undefined method `getlocal' for true:TrueClass>
不是将我的mongo数据库中的所有布尔值都改为Time对象,而是我可以在mongo上做一个方法/钩子,这样当从文档中提取这个属性时,我可以检查它是否是一个布尔值和用时间戳替换它?
答案 0 :(得分:3)
您不必使用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
中删除field
,一切正常。当然,如果您需要在等待修复MongoDB数据时进行某种手动类型转换或检查,则可能需要提供自己的def is_open
和def is_open=
方法。