问题是我在PostgreSQL数据库中接收空字符串而不是 nil 作为 enum 列的默认值,同时创建新的 ActiveRecord < / em>对象。这是一些更多的信息。
我的迁移:
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 值,但是当我尝试创建新对象时,我收到了&#34;未包含在列表错误中#34;:
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类型,而不是整数映射。
答案 0 :(得分:1)
有一个allow_blank
选项。
validates :status, inclusion: { in: Ticket::STATUS.values }, allow_blank: true
http://edgeguides.rubyonrails.org/active_record_validations.html#allow-blank
更新:为此,您应该在枚举中添加空字符串:
CREATE TYPE ticket_status AS ENUM ('', 'submitted', 'open', 'closed');