使用ActiveRecord和Postgresql的枚举类型

时间:2018-01-29 19:48:29

标签: ruby-on-rails postgresql activerecord

我在SitePoint中关注此tutorial以将模型属性设置为Enum值,自4.1起Rails支持该值。

而不是性别枚举,我正在尝试添加季节枚举。

这是我在public IReadOnlyCollection<IWebElement> GetVisibleElements(By locator) { return Driver.FindElements(locator).Where(e => e.Displayed).ToList(); }

中遇到的问题
schema.db

这是我的# Could not dump table "semesters" because of following StandardError # Unknown type 'season' for column 'season'

migration

我的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 文件:

model

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

1 个答案:

答案 0 :(得分:2)

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

潜在的问题是schema.rb是ActiveRecord看到它的数据库结构的表示,但ActiveRecord不理解很多东西(例如create type,CHECK约束和其他东西在PostgreSQL中出现在迁移中的execute some_raw_sql语句中。你可以create type想要schema.rb,但db/structure.sql永远不会看到它。

如果您想使用ActiveRecord不理解的东西,那么您必须使用structure.sql来存储数据库的结构。 config/application.rb存储数据库的结构,因为数据库理解它,而不是ActiveRecord理解它。

切换很简单:

  1. 更新您的config.active_record.schema_format = :sql以包含rake db:structure:dump
  2. 执行db/structure.sql获取初始db/schema.rb
  3. 从目录树和修订控件中删除db/structure.sql
  4. db:structure:dump添加到版本控制。
  5. 调整你的佣金习惯:
    • 使用db:schema:dump代替db:structure:load
    • 使用db:schema:load代替enum
  6. 那就是说,我不确定PostgreSQL的原生COPY table FROM '/home/folder1/a.csv' WITH DELIMITER=',' AND HEADER=FALSE; 类型与ActiveRecord的交互程度有多好,因为我从未这样做过。 AR's enums是字符串和整数之间的客户端转换,但PostgreSQL's enums在数据库内处理,并且彼此不了解。可能存在冲突,您需要确保彼此保持同步。