2017-02-09 54 views
0

我正在运行rails迁移,其中对于所有记录,我想根据现有列的值设置新列的结果值 - '得分了'。ActiveRecord Migrations - 根据现有列的值设置新列的值

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 

但是当我输入“斌/耙分贝:迁移”我得到以下错误:

rake aborted! StandardError: An error has occurred, this and all later migrations canceled: undefined method `<' for nil:NilClass

请帮帮忙,我怎么能写一个有条件的“如果”的轨道迁移?

回答

0

score字段为nil为报告行之一。 Ruby无法比较零。

咱们如果scorenil然后result0

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 
+0

是啊,如果得分是零,这是试图比较,如果“零<40”,这就是为什么它是失败的。我的错。谢谢! – GregF