Исправить неинициализированную постоянную ошибку существующих миграций для удаленной таблицы (включая модель) - PullRequest
0 голосов
/ 06 января 2020

У меня есть таблица автомобилей, которая была создана год за go и должна быть переименована в таблицу транспортных средств.

Миграция автомобильного стола

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

Миграция переименования таблицы транспортного средства

class RenameCarsToVehicles < ActiveRecord::Migration[5.1]
  def change
    rename_table :cars, :vehicles
  end
end

Однако при отбрасывании текущей базы данных и запуске миграции я получаю ошибку uninitialized constant AddDataToCarsModel::Car, поскольку я уже удалил модель автомобилей как часть ее. Какова лучшая практика для этих ситуаций? Стоит ли переходить на старую миграцию, которая была создана год go и обновлена? Как мы можем справиться с этими ситуациями?

Спасибо за помощь.

Ответы [ 2 ]

1 голос
/ 06 января 2020

Другой подход - проверить, существует ли класс 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
1 голос
/ 06 января 2020

В качестве исправления вашей миграции вы можете изменить 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 модель только в этой миграции. И это ничего не нарушит в жизненном цикле вашего приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...