【问题标题】:How to load Hanami Model in a migration?如何在迁移中加载 Hanami 模型?
【发布时间】:2018-03-14 03:29:36
【问题描述】:

我想更改表中的表结构,我需要用旧字段的值回填一些新字段。因此,为此,我想在迁移中使用存储库。但是,我似乎需要加载 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

所以,我现在不知道该怎么办。最大的问题是,如何在 Hanami 迁移中迁移数据?

【问题讨论】:

    标签: ruby hanami hanami-model


    【解决方案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
    

    【讨论】:

    • 谢谢你的回答,卢卡。实际上,正如您提到的,我使用 SQL 解决了我的问题,但我认为使用存储库会很好,因为我将进行与数据库无关的迁移,利用数据库驱动程序的 Hanami 模型封装。不过没关系!
    猜你喜欢
    • 1970-01-01
    • 2021-06-02
    • 2016-12-01
    • 2022-06-17
    • 2019-11-23
    • 2018-03-03
    • 2019-06-26
    • 2013-03-18
    • 2020-07-05
    相关资源
    最近更新 更多