迁移设置应考虑 GlobalSettings

我最近看到了一些设置迁移(最近的一次是删除了 automatic_backups_enabled),其中迁移仅使用数据库值来计算新值。这会忽略通过 app.ymldiscourse.conf 中所做的任何设置。

代码:

INSERT INTO site_settings (name, data_type, value, created_at, updated_at)
      SELECT 'backup_frequency', 3, NULL, 'NOW()', 'NOW()'
      WHERE EXISTS (
        SELECT 1
        FROM site_settings
        WHERE name = 'automatic_backups_enabled'
        AND VALUE = 'f'
        LIMIT 1
      )
      ON CONFLICT (name) DO UPDATE SET value = NULL, updated_at = 'NOW()';

这会忽略 discourse.conf 中的 automatic_backups_enabled = false,因此,当该设置存在时,不会保持备份禁用状态。

这艘船已经走了,但最好记住这种模式会导致全局覆盖的设置出现问题。

4 个赞

在这种情况下,我想我们将来在这些迁移过程中应该查看环境变量中的 DISCOURSE_...

@ted 我认为这值得追溯跟进,因为它将确立未来的模式。

我不确定 GlobalSetting 是否已加载,或者是否是我们想要依赖的东西,但看一下

ENV['DISCOURSE_AUTOMATIC_BACKUPS_ENABLED'] 并让它覆盖数据库中的设置可能是明智的。

@tgxworld / @ted 也许我们应该为此添加一个“迁移助手”?

例如:

MigrationHelper.get_setting('abc')
MigrationHelper.set_setting('abc', '123')
3 个赞

是的,GlobalSetting 在迁移期间已加载 :+1:

我认为您也不想依赖构建时环境变量?这使得将环境变量与 discourse.conf 分开以及实际的容器部署变得困难。在我接触过的其他领域(PHP/Laravel)中,这被视为一种反模式。

1 个赞