Ruby on Rails:创建新表时能否默认自动添加自定义列?
回答
可以实现,根据你是要替换默认主键,还是额外追加自定义列,两种场景配置方式不一样:
场景1:将uuid类型列作为默认主键,替换原自增id
这是Rails原生支持的全局配置项,一次配置后所有新建表默认主键都会变成uuid类型,不需要每个迁移单独指定。
打开config/application.rb,在配置块里加入生成器配置:
module YourAppName class Application < Rails::Application # 其他原有配置... config.generators do |g| g.orm :active_record, primary_key_type: :uuid end end end
配置完成后,后续无论是用生成器创建模型,还是手写迁移建表,默认生成的主键id都会是uuid类型,行为和原来的自增id完全一致。
场景2:保留原有自增id,每张表额外自动追加uuid类型的custom_column
如果不需要替换主键,只是想让所有新建表默认带上你指定的自定义列,可以通过给迁移表定义类打补丁实现全局生效。
新建初始化文件config/initializers/default_migration_columns.rb,写入以下代码(兼容Rails 6/7版本):
module DefaultCustomColumn def initialize(*args, **kwargs) super # 自动追加uuid类型的custom_column,可按需调整约束、默认值 column :custom_column, :uuid, default: -> { "gen_random_uuid()" }, null: false # 如果需要给该列加唯一索引,放开下面这行注释即可 # index :custom_column, unique: true end end ActiveSupport.on_load(:active_record) do ActiveRecord::ConnectionAdapters::TableDefinition.prepend DefaultCustomColumn end
注意事项
- 如果你用PostgreSQL数据库:
gen_random_uuid()是PostgreSQL 13及以上版本自带的uuid生成函数,低版本可以替换为uuid_generate_v4(),需要提前在迁移里启用pgcrypto扩展。 - 如果你用MySQL数据库:默认值可以调整为
-> { "UUID()" }适配MySQL的内置uuid生成逻辑。 - 该配置仅对配置生效后新建的迁移有效,已经存在的老表不会自动追加列,需要单独写迁移补加字段。
- 如果有个别表不需要这个自定义列,可以扩展逻辑加个跳过参数,建表时传入
skip_custom_column: true就不会自动追加该列。
内容的提问来源于stack exchange,提问作者Vinicius Köhler
相关产品推荐
相关产品推荐

