修改迁移栏中未加载的迁移列

时间:2016-12-12 13:38:23

标签: ruby-on-rails ruby database-migration

我添加了两个迁移,在第一个中我向模型添加了一个列,在第二个中,我执行了一个函数,该值将值存储到最近添加的某些行的列中。

问题在于,当我运行rake db:migrate时,第二次迁移会引发错误,因为第一次迁移已加载但数据库尚未更改,因此一种方法是运行命令两次(它可以工作) 。

首次迁移:

class AddRegisteredReportToSpecialOfferUse < ActiveRecord::Migration
  def up
    add_column :special_offer_uses, :registered_report, :boolean, default: false
  end

  def down
    remove_column :special_offer_uses, :registered_report
  end
end

第二次迁移:

class CreateReportsFromMigrations < ActiveRecord::Migration
  def change
    OneClass.perform
  end
end

OneClass.perform是一个更新先前添加的属性的方法

def perform
´´´
special_offer_uses.update_attribute(:registered_report, true)
´´´
end

抛出的错误:

  

StandardError:发生错误,所有以后的迁移都被取消:    未定义的方法`registered_report =

请注意,undefined方法是先前添加的属性的名称。

我想知道是否有办法避免两次运行命令而不会抛出任何错误。

更新

我找到了一个使用 reset_column_information 方法的解决方案,该方法会在下一个请求时重新加载列。

  

重置有关列的所有缓存信息,这将导致它们在下一个请求时重新加载。

     

此方法最常见的使用模式可能是在迁移中,在创建表后,您希望使用某些默认值填充它

更多信息:link

1 个答案:

答案 0 :(得分:0)

为什么不在一次迁移中完成所有操作?

class AddRegisteredReportToSpecialOfferUse < ActiveRecord::Migration
  def up
    add_column :special_offer_uses, :registered_report, :boolean, default: false
    OneClass.perform
  end

  def down
    remove_column :special_offer_uses, :registered_report
  end
end