Рельсы |Миграция отсутствует |Работает локально, но не на Heroku - PullRequest
0 голосов
/ 14 декабря 2018

Это мой первый пост в Stackoverflow, поэтому, пожалуйста, дайте мне знать, если я могу указать свою проблему лучше, чем я: я искал на сайте и не нашел ничего, что решило бы мою проблему.

У меня есть приложение, работающее локально с моделью Event .

Модель имеет столбец start_date , и позже я добавил end_date с миграцией.

Все работает локально.

При развертывании в Heroku при попытке создать запись Event появляется ошибка 500 .

Сначала он дал мне ActiveRecord :: MultiparameterAssignmentErrors , сказав, что он не может ничего присвоить end_date =.

Я просмотрел все и убедился, что этодопустимый параметр.

Затем я просмотрел свои миграции и с удивлением обнаружил, что моя AddEndDateToEvents миграция не существует, но столбец end_date присутствует в моей модели схемы.

Итак, я запустил rails g миграции AddEndDateToEvents , где я написал:

class AddEndDateToEvents < ActiveRecord::Migration[5.2]
  def change
    remove_column :events, :end_date
    add_column :events, :end_date, :date
  end
end

Я запустил rails db: migrate и все работает локально.

Теперь, когда я отправляю его в Heroke и запускаю там также db: migrate , он, конечно, завершается и говорит мне, что не может удалить столбец end_date , потому чтоего нет в модели.

Я застрял.Что мне делать?: (

Ссылки моего исходного кода

Спасибо взаранее!

Оливер

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

Я решил это с вашей помощью, Марк!: -)

Я сделал следующее:

1) Откат миграций

Я запустил rails db:migrate:status и увидел, что я должен откатить двамиграции, чтобы полностью очистить мои попытки добавить / удалить столбец end_date.

Когда я попытался откатить, это дало мне ошибку, что мои миграции удаления столбца не были обратимыми.Я должен был ввести тип столбца.Поэтому я добавил это в качестве третьего параметра.Пример: remove_column :events, :end_date, :date

После этого возможен откат.Самым простым способом было запустить rails db: rollback STEP = 2 .

2) Удалить миграции вниз и проверить схему

После отката моегомиграции, я удалил ненужные файлы миграции из папки.Кроме того, я проверил свой файл схемы и вручную удалил строку end_date из модели.

3) Создайте условное удаление переноса строки

Используя ответ Марка, я добавил новыйМиграция с использованием следующего кода:

class AddEndDateToEvents < ActiveRecord::Migration[5.2]
  def change
    remove_column(:events, :end_date) if column_exists?(:events, :end_date)
    add_column :events, :end_date, :date
  end
end

4) Сброс базы данных и запуск db: migrate

Затем я сделал git push && git push heroku и затем я запустил heroku restart && heroku pg:reset DATABASE --confirm APP-NAME && heroku run rake db:migrate, где APP-NAME было именем моего приложения.

И теперь оно работает!: -)

Большое спасибо.Я был просто поражен быстрым и полезным ответом, а также тем фактом, что какой-то человек, находящийся в сети, нашел время, чтобы отредактировать мой пост и красиво отформатировать его.

Щедрое сообщество.Nice!

0 голосов
/ 14 декабря 2018

Похоже, что ваши миграции не синхронизированы, как вы говорите.Лучший способ охватить обе базы - добавить условное выражение в миграцию.Rails поставляется с методом column_exists?

https://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/column_exists%3F

, который мы можем использовать в нашей миграции:

class AddEndDateToEvents < ActiveRecord::Migration[5.2]
  def change
    remove_column(:events, :end_date) if column_exists?(:events, :end_date)
    add_column :events, :end_date, :date
  end
end

Теперь он должен работать независимо от того, была ли начальная миграция или нет

РЕДАКТИРОВАТЬ: вероятно, лучше синхронизировать обе ваши базы данных, поэтому, если в вашей базе данных Heroku нет важных данных, вы всегда можете просто удалить ее, заново создать и выполнить все миграции изНачните.Я думаю, что это предпочтительнее, если вы можете позволить себе потерять все данные, которые есть в вашем Heroku DB

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