ActiveRecord Migrations - 根据现有列的值设置新列的值

时间:2017-02-09 04:22:20

标签: ruby-on-rails activerecord

我正在运行rails迁移,对于所有记录,我想设置新列的值'结果'基于现有列的值 - '得分'。

class AddResultToReports < ActiveRecord::Migration
  def change
    add_column :reports, :result, :integer
    Report.all.each do |r|
      r.update_attribute(:result, 0) if (r.score < 40)
      r.update_attribute(:result, 1) if (r.score >= 40)
    end
   add_index :reports, :result
  end
end

但是当我键入&#39; bin / rake db:migrate&#39;我收到以下错误:

  耙子流产了!   StandardError:发生错误,此以及所有后续迁移都已取消:   未定义的方法`&lt;&#39;为零:NilClass

请帮忙,我该怎么写有条件的&#39; if&#39;在铁路迁移?

1 个答案:

答案 0 :(得分:0)

对于报告的一行,

score字段为nil。 Ruby无法比较nil。

如果scorenil,那么result将为0

class AddResultToReports < ActiveRecord::Migration
  def change
    add_column :reports, :result, :integer
    add_index :reports, :result

    Report.find_each do |r|
      if r.score.nil? || r.score < 40
        r.update_attribute(:result, 0) 
      else
        r.update_attribute(:result, 1)
      end
    end
  end
end