空字符串作为枚举类型列的默认值而不是Rails中的nil

时间:2015-04-09 20:37:40

标签: ruby-on-rails postgresql validation activerecord enums

问题是我在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类型,而不是整数映射。

1 个答案:

答案 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');