问题是,在创建新的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/