重命名单个 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 名称。因此,代码库的这一部分将在几分钟内无法使用。对于用户甚至不关心的更改来说不太好:/
您可以这样做:
- 创建
ULD < Component
component/file,即 Uld < Component
的副本。 IE。有 2 个组件,不要删除 Uld
- 在您之前获取
Uld
的地方,现在您可以获取类型为 Uld
或 ULD
的记录
- 在您创建新
Uld
条记录的地方创建新的 ULD
条记录
- 部署这些更改而不进行任何迁移,这样您的服务器将向后兼容
Uld
,但也可以与 ULD
一起使用
- 立即部署迁移
- 最后,删除所有与旧
Uld
相关的 mentions/files 并重新部署
我有一个 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 名称。因此,代码库的这一部分将在几分钟内无法使用。对于用户甚至不关心的更改来说不太好:/
您可以这样做:
- 创建
ULD < Component
component/file,即Uld < Component
的副本。 IE。有 2 个组件,不要删除Uld
- 在您之前获取
Uld
的地方,现在您可以获取类型为Uld
或ULD
的记录
- 在您创建新
Uld
条记录的地方创建新的ULD
条记录 - 部署这些更改而不进行任何迁移,这样您的服务器将向后兼容
Uld
,但也可以与ULD
一起使用
- 立即部署迁移
- 最后,删除所有与旧
Uld
相关的 mentions/files 并重新部署