Rails - Mongoid:模型中新添加的字段为旧数据对象提供 nil

rtd*_*tdp 5 ruby-on-rails mongodb mongoid ruby-on-rails-3

我的模型如下:

class User
  include Mongoid::Document
  field :name
end
Run Code Online (Sandbox Code Playgroud)

将一些用户对象保存到数据库后,我添加了更多字段:

class User
  include Mongoid::Document
  include Mongoid::Timestamps::Created
  field :name
  field :birthdate
end
Run Code Online (Sandbox Code Playgroud)

现在,我希望可以使用以下代码片段:

@user = User.all
@user.each do |u|
   puts u.name
   puts u.birthdate.strftime(#someFormat)
   puts u.created_at.strftime(#someFormat)
end
Run Code Online (Sandbox Code Playgroud)

不幸的是,因为我的旧user对象没有birthdate密钥,所以我收到此错误:strftime called on nil class

问题:

  • 我如何使用 Mongoid 处理此类情况?在 MySQL 中,当添加列时,它也会添加到旧行中。但如果我在 MongoDB 中看到,它不会添加新字段作为旧数据的键。
  • 该字段也存在此问题,created_at因为旧数据也没有该字段。

我正在寻找解决此问题的好方法,nil每次检查条件不是一个可扩展的选项,因为字段的数量将继续增加。

the*_*RON 5

您还可以向新字段添加默认值,这将为所有旧记录提供后备值。

class User
  include Mongoid::Document
  include Mongoid::Timestamps::Created

  field :name
  field :birthdate, :type => Date, :default => Date.new(1970,1,1)
end
Run Code Online (Sandbox Code Playgroud)

您可以更新缺少值的模型created_at,但只需在 Rails 控制台中运行一些简单的操作即可:

User.all.each{ |u| u.update_attributes(:created_at => Time.now) if u.created_at.nil? }
Run Code Online (Sandbox Code Playgroud)