【发布时间】:2015-04-09 20:37:40
【问题描述】:
问题是我收到空字符串而不是 nil 作为 PostgreSQL 数据库中 enum 列的默认值,同时创建新的 ActiveRecord 对象。这是更多信息。
我的迁移:
class CreateTickets < ActiveRecord::Migration
def change
execute <<-SQL
CREATE TYPE ticket_status AS ENUM ('submitted', 'open', 'closed');
SQL
create_table :tickets do |t|
t.string :name
t.column :status, :ticket_status
t.timestamps null: false
end
end
end
我的模特:
class Ticket < ActiveRecord::Base
STATUS = {
submitted: 'submitted',
open: 'open',
closed: 'closed'
}
validates :status, inclusion: { in: Ticket::STATUS.values }, allow_nil: true
end
我的目标是在数据库表中允许 nil 值,但是当我尝试创建新对象时,我收到“未包含在列表中的错误”:
2.2.0 :005 > Ticket.create!
(0.8ms) BEGIN
(0.5ms) ROLLBACK
ActiveRecord::RecordInvalid: Validation failed: Status is not included in the list
这是因为创建新对象时使用空字符串作为状态列中的默认值,而其他列得到正确的 nil 值:
2.2.0 :010 > Ticket.new
=> #<Ticket id: nil, name: nil, status: "", created_at: nil, updated_at: nil>
这里还有一个条件,我确实想使用原生 PostgreSQL ENUM 类型,而不是整数映射。
【问题讨论】:
-
尝试使用
t.column :status, :ticket_status, default: nil设置默认值
标签: ruby-on-rails postgresql validation activerecord enums