修复已删除 table(包括模型)的现有迁移的未初始化常量错误
Fix uninitialized constant error of existing migrations for deleted table (including model)
我有一辆汽车 table 是一年前创建的,现在需要重命名为车辆 table。
汽车table移民
class AddDataToCarsModel < ActiveRecord::Migration[5.0]
def change
# some cars are missing their created timestamp
Car.where(created_at: nil).each do |car|
date = Time.zone.now
car.update_attribute(:created_at, date)
end
end
end
车辆table重命名迁移
class RenameCarsToVehicles < ActiveRecord::Migration[5.1]
def change
rename_table :cars, :vehicles
end
end
但是,当删除当前数据库和 运行 迁移时,我得到 uninitialized constant AddDataToCarsModel::Car
错误,因为我已经删除了汽车模型作为其中的一部分。
这些情况的最佳做法是什么?是否值得 运行 进入一年前创建的旧迁移并更新它?
我们如何处理这些情况?
感谢您的帮助。
作为迁移的修复,您可以将 AddDataToCarsModel
迁移更改为:
class AddDataToCarsModel < ActiveRecord::Migration[5.0]
class Car < ActiveRecord::Base
self.table_name = 'cars'
end
def change
# some cars are missing their created timestamp
Car.where(created_at: nil).each do |car|
date = Time.zone.now
car.update_attribute(:created_at, date)
end
end
end
因此您只能在此迁移中使用 Cars
模型。而且这不会破坏您的应用程序生命周期。
另一种方法是检查 class Car
是否存在。
class AddDataToCarsModel < ActiveRecord::Migration[5.0]
def change
if begin
Object.const_get(Car.to_s).is_a?(Class)
rescue StandardError
false
end
# some cars are missing their created timestamp
# All the car objects can be updated at once using this.
Car.where(created_at: nil).update_all(created_at: Time.current)
end
end
end
我有一辆汽车 table 是一年前创建的,现在需要重命名为车辆 table。
汽车table移民
class AddDataToCarsModel < ActiveRecord::Migration[5.0]
def change
# some cars are missing their created timestamp
Car.where(created_at: nil).each do |car|
date = Time.zone.now
car.update_attribute(:created_at, date)
end
end
end
车辆table重命名迁移
class RenameCarsToVehicles < ActiveRecord::Migration[5.1]
def change
rename_table :cars, :vehicles
end
end
但是,当删除当前数据库和 运行 迁移时,我得到 uninitialized constant AddDataToCarsModel::Car
错误,因为我已经删除了汽车模型作为其中的一部分。
这些情况的最佳做法是什么?是否值得 运行 进入一年前创建的旧迁移并更新它?
我们如何处理这些情况?
感谢您的帮助。
作为迁移的修复,您可以将 AddDataToCarsModel
迁移更改为:
class AddDataToCarsModel < ActiveRecord::Migration[5.0]
class Car < ActiveRecord::Base
self.table_name = 'cars'
end
def change
# some cars are missing their created timestamp
Car.where(created_at: nil).each do |car|
date = Time.zone.now
car.update_attribute(:created_at, date)
end
end
end
因此您只能在此迁移中使用 Cars
模型。而且这不会破坏您的应用程序生命周期。
另一种方法是检查 class Car
是否存在。
class AddDataToCarsModel < ActiveRecord::Migration[5.0]
def change
if begin
Object.const_get(Car.to_s).is_a?(Class)
rescue StandardError
false
end
# some cars are missing their created timestamp
# All the car objects can be updated at once using this.
Car.where(created_at: nil).update_all(created_at: Time.current)
end
end
end