Rails 7.1.2 中 Postgres 未定义列的枚举错误

问题描述 投票:0回答:1

检查对象时发生错误:

#<ActiveRecord::StatementInvalid:"PG::UndefinedColumn: ERROR:  column product_proposals.status_ids does not exist\nLINE 1: ...oduct_proposals\".* FROM \"product_proposals\" WHERE \"product_p...\n                                                             ^\nHINT:  Perhaps you meant to reference the column \"product_proposals.status_id\".\n">'

这就是我正在使用的方法:

attribute :status_ids, :string
  attribute :type_ids, :string
 
  enum :status_ids, [
    pending: 0,
    verified: 1,
    work_in_progress: 2,
    complete: 3
]

  enum :type_ids, {
    price_variance: 0,
    oos_in_store: 1,
    not_in_store_file: 2,
    not_in_master_db: 3,
    data_not_correct: 4
  }

我已经明确定义了属性,因为出现了此错误:

Undeclared attribute type for enum 'type_ids'. Enums must be backed by a database column or declared with an explicit type via `attribute`. (RuntimeError)

我想要永久修复此问题

ruby-on-rails ruby enums pg
1个回答
0
投票

要解决此异常,请注意

enum
名称必须与数据库中的属性名称匹配,并且必须是 单数

enum :status_id, {
  pending: 0,
  verified: 1,
  work_in_progress: 2,
  complete: 3
}

enum :type_id, {
  price_variance: 0,
  oos_in_store: 1,
  not_in_store_file: 2,
  not_in_master_db: 3,
  data_not_correct: 4
}

那是因为它不是一个简单的常数。声明枚举还会为该属性创建作用域方法和 bang 方法,并且可以通过(自动)复数

.statuses
.types
方法访问列表本身。

请参阅

ActiveRecord::Enum
文档。

此外,属性名称中不需要

_id
后缀,除非这是关联或实际 ID(例如外部 ID)。

最后,不建议在枚举中使用整数值,因为它们更难以读取和维护(例如,如果您决定删除某个键,则以后不能使用其整数表示形式,或者每次都必须显式迁移数据库)。

所以最终的推荐结果是:

enum :status, {
  pending: 'pending',
  verified: 'verified',
  work_in_progress: 'work_in_progress',
  complete: 'complete'
}

enum :type, {
  price_variance: 'price_variance',
  oos_in_store: 'oos_in_store',
  not_in_store_file: 'not_in_store_file',
  not_in_master_db: 'not_in_master_db',
  data_not_correct: 'data_not_correct'
}
© www.soinside.com 2019 - 2024. All rights reserved.