gpt4 book ai didi

ruby-on-rails - 在 Rails 中使用 Postgres 枚举类型时,在迁移中指定 CREATE TYPE xyz_setting AS ENUM 会破坏您的 db/schema.rb 文件

转载 作者:行者123 更新时间:2023-12-05 08:30:23 25 4
gpt4 key购买 nike

这是基于此处的一些 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 核心不支持 native Postgres 类型。

我可以在 Rails 5.17、5.2.2.4 和 6.0.3 上重现该行为

如果我这样做...

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

然后我的模式文件搞砸了,具体来说,模式用户表没有得到任何输出,取而代之的是这条消息

由于以下标准错误而无法转储表“用户”

“xyz”列的未知类型“xyz_setting”

最佳答案

PostgreSQL (Rails 7+) 中的自定义枚举类型

Rails 7 added support for custom enum types in PostgreSQL .

那么现在,一个迁移可以写成如下:

# db/migrate/20131220144913_create_articles.rb
def up
create_enum :article_status, ["draft", "published"]

create_table :articles do |t|
t.enum :status, enum_type: :article_status, default: "draft", null: false
end
end

# There's no built in support for dropping enums, but you can do it manually.
# You should first drop any table that depends on them.
def down
drop_table :articles

execute <<-SQL
DROP TYPE article_status;
SQL
end

还值得一提的是,当你使用create_enum ,枚举定义和枚举列将显示在 schema.rb 中。

来源:

关于ruby-on-rails - 在 Rails 中使用 Postgres 枚举类型时,在迁移中指定 CREATE TYPE xyz_setting AS ENUM 会破坏您的 db/schema.rb 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64668994/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com