【问题标题】:Rails - Mongoid : newly added fields in model giving nil for old data objectsRails - Mongoid:模型中新添加的字段为旧数据对象提供 nil
【发布时间】:2011-06-22 11:06:01
【问题描述】:

我的模型如下:

class User
  include Mongoid::Document
  field :name
end

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

class User
  include Mongoid::Document
  include Mongoid::Timestamps::Created
  field :name
  field :birthdate
end

现在,我希望我可以使用以下 sn-p:

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

很遗憾,因为我的旧 user 对象没有 birthdate 键,我收到此错误:strftime called on nil class

问题:

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

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

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 mongodb mongoid


    【解决方案1】:

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

    class User
      include Mongoid::Document
      include Mongoid::Timestamps::Created
    
      field :name
      field :birthdate, :type => Date, :default => Date.new(1970,1,1)
    end
    

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

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

    【讨论】:

      【解决方案2】:

      1) 您可以检查这些字段的 nil 值:

      @user = User.all
      @user.each do |u|
         puts u.name
         puts u.birthdate.strftime(#someFormat) if u.birthdate
         puts u.created_at.strftime(#someFormat) if u.created_at
      end
      

      2) 您可以使用这些字段的实际非 nil 值更新所有旧模型。您可以使用 mondodb 更新(阅读更多 here)或编写这样的 ruby​​ 脚本:

      User.all.select{|u| u.birthdate.nil? || u.created_at.nil?}.each do |u|
        u.update_attributes(:birthdate => Date.today, :created_at => Time.now)
      end
      

      birthdate 和 created_at 属性由示例值填充。

      【讨论】:

      • 关于使用第二种方法编写 ruby​​ 脚本的任何指南?
      猜你喜欢
      • 1970-01-01
      • 2015-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多