我添加了两个迁移,在第一个中我向模型添加了一个列,在第二个中,我执行了一个函数,该值将值存储到最近添加的某些行的列中。
问题在于,当我运行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
答案 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