问题是,在创建新的ActiveRecord对象时,PostgreSQL数据库中枚举列的默认值是空字符串而不是nil。这里有更多的信息。
我的迁移:

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值,但是当我试图创建新对象时,我收到“notincludeinthelist error”:
2.2.0 :005 >   Ticket.create!
   (0.8ms)  BEGIN
   (0.5ms)  ROLLBACK
ActiveRecord::RecordInvalid: Validation failed: Status is not included in the list

发生这种情况的原因是,在“状态”列中创建的新对象的默认值为空字符串,而其他列的值为正确的零:
2.2.0 :010 >   Ticket.new
 => #<Ticket id: nil, name: nil, status: "", created_at: nil, updated_at: nil>

这里还有一个条件,我确实想使用本地PostgreSQL枚举类型,而不是整数映射。

最佳答案

有一个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');

关于ruby-on-rails - 空字符串作为枚举类型列的默认值,而不是Rails中的nil,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29548499/

10-16 18:30