轨道:枚举字段采用 nil 值,即使默认值设置为 0



>我在模型中定义了以下enum字段:

class ClientRegistration < ApplicationRecord
enum status: { pending: 0, registered: 1, activated: 2, suspended: 3 }
enum cloud_type: { onprem: 0, aws: 1, gcp: 2, azure: 3 }
end

相同的迁移文件如下所示:

class CreateClientRegistrations < ActiveRecord::Migration[5.2]
def change
create_table :client_registrations do |t|
t.string :instance_id
t.string :private_ip
t.string :mac_address
t.integer :cloud_type, default: 0
t.string :public_ip
t.string :region
t.integer :status, default: 0
t.timestamps
end
end
end

现在奇怪的是,如果我不指定任何列状态,我的第一列状态不会获得默认值。此外,如果我显式指定为pending,它也不会采用第一个值。但是它在我的第二列cloud_type的情况下有效,如果我不指定任何列,它会默认为onprem。我需要更改column_name左右吗?

您可以尝试在迁移中添加"null: false"。

t.integer :cloud_type, null: false, default: 0
t.integer :status, null: false, default: 0

当您在表创建/迁移期间添加默认值时(例如default: 0(,它只适用于创作;在未显示值时将该值传递给列。

当您在创建列后更新列时,这不起作用。要解决此问题,您可以验证模型中的枚举,如下所示:

validates :status, presence: true, inclusion: { in: statuses.keys }
validates :cloud_type, presence: true, inclusion: { in: cloud_types.keys }

我希望这有所帮助。

最新更新