gpt4 book ai didi

ruby-on-rails - ActiveRecord 和 Postgresql 的枚举类型

转载 作者:行者123 更新时间:2023-11-29 12:08:39 29 4
gpt4 key购买 nike

我正在关注这个 tutorial从 SitePoint 将模型属性设置为枚举值,从 4.1 开始,Rails 支持该值。

我试图添加一个季节枚举,而不是性别枚举。

这是我在 schema.db

中遇到的问题
# Could not dump table "semesters" because of following StandardError
# Unknown type 'season' for column 'season'

这是我的迁移:

class AddSeasonToSemesters < ActiveRecord::Migration[5.1]
def up
execute <<-SQL
CREATE TYPE season AS ENUM ('fall', 'winter', 'spring', 'summer');
SQL

add_column :semesters, :season, :season, index: true
end

def down
remove_column :semesters, :season

execute <<-SQL
DROP TYPE season;
SQL
end
end

还有我的模型文件:

class Semester < ApplicationRecord
enum season: {
fall: 'fall',
winter: 'winter',
spring: 'spring',
summer: 'summer'
}
end

知道我做错了什么吗?任何方向将不胜感激,谢谢。

最佳答案

您需要从 db/schema.rb 切换到 db/structure.sql

潜在的问题是 schema.rb 是 ActiveRecord 所见的数据库结构的表示,但 ActiveRecord 不理解很多事情(例如 create type、CHECK 约束和其他出现在 execute some_raw_sql statements in migrations 中的东西)PostgreSQL 做的。您可以随心所欲地创建类型,但schema.rb 永远看不到它。

如果你想使用 ActiveRecord 不理解的东西,那么你必须使用 db/structure.sql 来存储你的数据库结构。 structure.sql 按照数据库理解的方式存储数据库的结构,而不是 ActiveRecord 理解的方式。

切换很容易:

  1. 更新您的 config/application.rb 以包含 config.active_record.schema_format = :sql
  2. 执行 rake db:structure:dump 以获得初始 db/structure.sql
  3. 从目录树和版本控制中删除 db/schema.rb
  4. db/structure.sql 添加到修订控制。
  5. 调整您的佣金习惯:
    • 使用 db:structure:dump 代替 db:schema:dump
    • 使用 db:structure:load 代替 db:schema:load

也就是说,我不确定 PostgreSQL 的原生 enum 类型与 ActiveRecord 交互的效果如何,因为我从未这样做过。 AR's enums是字符串和整数之间的客户端转换,但是 PostgreSQL's enums在数据库内部处理,它们彼此不了解。可能存在冲突,您需要确保它们彼此同步。

关于ruby-on-rails - ActiveRecord 和 Postgresql 的枚举类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48508905/

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