字段可能有不同类型的mongoid

时间:2014-09-19 03:59:49

标签: ruby-on-rails ruby mongodb mongoid

在我的模特中我有

field :is_open, type: Time, default: nil

但是之前在同一个模型中,我将此类型存储为布尔值。我现在想把它改成类型时间。对于我的数据库中的新项目,这可以正常工作,但对于旧记录,当我尝试访问此属性时,它仍然存储为布尔值

modelInstance.is_open

我收到以下错误:

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

不是将我的mongo数据库中的所有布尔值都改为Time对象,而是我可以在mongo上做一个方法/钩子,这样当从文档中提取这个属性时,我可以检查它是否是一个布尔值和用时间戳替换它?

1 个答案:

答案 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_opendef is_open=方法。