这是基于www.example.com上的一些dev.to文章,这里是https://dev.to/diegocasmo/using-postgres-enum-type-in-rails-30mo,这里是https://dev.to/amplifr/postgres-enums-with-rails-4ld0,这里是同一个人的文章https://medium.com/@diegocasmo/using-postgres-enum-type-in-rails-799db99117ff
如果您遵循上面的建议,建议您通过直接在Postgres上使用CREATE TYPE xyz_setting AS ENUM
为Postgres支持的模式创建Rails模式迁移,然后使用它创建新字段作为ENUM(postgres枚举)
不幸的是,这种方法有破坏db/schema.rb
文件的缺点。
我认为问题在于Rails核心不支持原生Postgres类型。
我可以在Rails 5.17、www.example.com和6.0.3上重现这种行为5.2.2.4
如果我做了...
class AddXyzToUsers < ActiveRecord::Migration[5.2]
def up
execute <<-DDL
CREATE TYPE xyz_setting AS ENUM (
'apple', 'bananna', 'cherry'
);
DDL
add_column :users, :xyz, :xyz_setting
end
def down
remove_column :users, :xyz
execute "DROP type xyz_setting;"
end
end
那么我的模式文件就混乱了,具体来说,schemausers表没有得到输出whatseover,取而代之的是以下消息
4条答案
按热度按时间to94eoyn1#
PostgreSQL(Rails 7+)中的自定义枚举类型
Rails 7 added support for custom enum types in PostgreSQL.
现在,迁移可以编写如下:
另外值得一提的是,当您使用
create_enum
时,枚举定义和枚举列将在schema.rb
中呈现。qyyhg6bp2#
Rails不支持开箱即用的自定义PG类型。
正如Diego Castillo所述,您可以使用SQL模式来处理这些类型。
但是,如果您想继续使用ruby模式,可以使用activerecord-postgres_enum,这是一个gem,它支持PostgreSQL枚举数据类型。
tkclm6bt3#
在Rails 7中,如果您正在使用PostgreSQL,现在可以执行以下操作:
您的迁移可能类似于:
您的模式如下所示:
然后,在您的模型上,您需要添加:
pokxtpni4#
我非常喜欢@crysicia的回答,但更准确地说,对于下一位开发人员,对于Rails 6,您可以选择以下两种方式之一:
1.使用activerecord-postgres_enum
1.将您的Rails应用程序切换到SQL模式(假设您在
db/schema.rb
使用本地Rails模式),这将生成db/structure.sql
,当然将使用本地SQL编写您的模式。第二种方法当然不受Rails-DB分离纯粹主义者的欢迎,但无论如何,整个实现都是如此,因为我不知道还有其他支持枚举的DB(可能有)。
因此,基本上,如果您希望保留
db/schema.rb
,我建议使用activerecord-postgres_enum gem