重命名单个 table 继承 rails 模型 class 名称而不更改现有数据

Rename single table inheritance rails model class name without changing existing data

我有一个 ActiveRecord STI subclass,我想重命名(区分大小写的更改)。

但是,如果我更改子class 的class 名称,ActiveRecord 将无法再实例化现有记录,因为旧的class 名称位于type 基础的列 table.

如何在不更改数据库内容的情况下更改 class 的名称,以便重命名的影响最小。

示例:

class Uld < Component 应该变成 ULD < Component。重命名方法需要数据库迁移

def up
  Component.where(type: 'Uld').update_all(type: 'ULD')
end

def down
  Component.where(type: 'ULD').update_all(type: 'Uld')
end

但是在 heroku 上部署这会导致问题,因为数据更改首先发生,代码甚至没有可用的新 class 名称。因此,代码库的这一部分将在几分钟内无法使用。对于用户甚至不关心的更改来说不太好:/

您可以这样做:

  1. 创建 ULD < Component component/file,即 Uld < Component 的副本。 IE。有 2 个组件,不要删除 Uld
  2. 在您之前获取 Uld 的地方,现在您可以获取类型为 UldULD
  3. 的记录
  4. 在您创建新 Uld 条记录的地方创建新的 ULD 条记录
  5. 部署这些更改而不进行任何迁移,这样您的服务器将向后兼容 Uld,但也可以与 ULD
  6. 一起使用
  7. 立即部署迁移
  8. 最后,删除所有与旧 Uld 相关的 mentions/files 并重新部署