Как загрузить модель Hanami в процессе миграции?

Я хочу изменить структуру таблицы в таблице, и мне нужно заполнить некоторые новые поля значениями старых. Итак, для этого я хочу использовать хранилище в процессе миграции. Но, похоже, мне нужно загрузить модель Hanami, чтобы использовать репозиторий, поскольку Hanami не загружает его при запуске миграции.

Итак, сейчас у меня есть это:

require_relative '../../lib/my_app/repositories/entity_repository'
require_relative '../../lib/my_app/entities/my_entity'

Mutex.new.synchronize do
  Hanami::Model.load!
end

Hanami::Model.migration do
  change do
    def backfill_data!
      repo = EntityRepository.new

      repo.all.map do |entity|
        repo.update entity.id, new_field_as_date: Date.new(entity.old_field)
      end
    end

    backfill_data!
  end
end

Но при запуске этой миграции я получаю

bundler: failed to load command: hanami (/Users/user/.rbenv/versions/2.4.1/bin/hanami)
Hanami::Model::Error: key not found: :person
# which is an association with the entity mentioned on the code

Итак, я понятия не имею, что делать сейчас. Большой вопрос, как перенести данные о миграции Ханами?

1 ответ

Решение

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

Вы должны использовать средства базы данных напрямую. Это гарантировало бы миграцию работать всегда:

Hanami::Model.migration do
  up do
    run "UPDATE users SET last_login_at=(last_login_at - INTERVAL '1 day')"
  end

  down do
  end
end
Другие вопросы по тегам