修复已删除 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