Загрузка данных семян для миграции рельсов

У меня есть существующая база данных, в которой я конвертирую предыдущий столбец "NULL" в значение, которое имеет значение по умолчанию (и заполняет это значением по умолчанию). Однако это значение является идентификатором записи, которую мне нужно создать. Если я поместил эту запись в db/seeds.rb, она не будет запущена, потому что db/seeds.rb запускается после миграции, но для миграции требуются семенные данные. Если я оставлю создание записи в процессе миграции, то я не получу запись, если я создам новую базу данных с db:load. Есть ли лучший способ, кроме дублирования этого как в db/seeds.rb, так и в миграции?

Спасибо!

Ответ 1

По-моему, вы должны относиться к этому как к db/seeds.rb, так и к миграции.

Миграция используется для получения существующей базы данных из старой версии в другую версию, а seeds.rb и schema.rb используются для новой базы данных с последней версией.

Ответ 2

В то время как я могу понять ваше желание остаться сухим и не писать это как в миграции, так и в seeds.rb, я думаю, вы должны написать его в обоих местах. Не только для того, чтобы это работало, но и для выполнения различных требований, связанных с вашей проблемой.

  • Вам нужно убедиться, что миграция может выполняться должным образом независимо от внешних процессов. Это означает, что вы должны поместить любой код в эту конкретную миграцию. Это не должно ничего сделать, кроме того, чтобы убедиться, что ваша миграция выполнена правильно. Предположим, что кто-то еще пытается мигрировать, не зная, что вы поместили часть кода в seeds.rb, было бы очень сложно понять, что происходит.

  • Вы можете сделать db: load работать правильно, включив аналогичный код в seeds.rb. Однако вы должны оценивать текущее состояние вашей базы данных в seeds.rb из-за того, что он запускается после миграции. Таким образом, вы можете проверить, существует ли столбец и каково значение по умолчанию и т.д. Это означает, что если миграция выполнялась и заботилась обо всем, seeds.rb не повторял работу или не изменял значения некорректно. Однако, если миграция не задала эти переменные, как ожидалось, она может установить значения.

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