我的迁移是
class AddUuidToUsers < ActiveRecord::Migration
def change
add_column :users, :uuid, :uuid, null: false, default: 'uuid_generate_v4()'
add_index :users, :uuid
end
end
架构更改为:
t.uuid "uuid", default: "uuid_generate_v4()"
如您所见,我们未添加null: false
,不确定原因?
但是当我尝试使用常见的列类型string
时,它运行良好。
我们无法使用:uuid
null: false
列类型是否有任何限制?
答案 0 :(得分:1)
对于具有默认值的uuid列,Rails 4.2完全忽略null
选项。您可以检查模型的列对象:
> User.columns[2] # number of uuid column
=> #<ActiveRecord::ConnectionAdapters::PostgreSQLColumn:0x007fe6fee53f20 ...
@sql_type="uuid", @null=true, @default=nil, @default_function="uuid_generate_v4()">
但是迁移选项与示例中的相同:
add_column :users, :uuid, :uuid, null: false, default: 'uuid_generate_v4()'
Rails 5.0修复了这个bug。 Column对象为同一次迁移保留null
选项:
> User.columns[2]
=> #<ActiveRecord::ConnectionAdapters::PostgreSQLColumn:0x007fa6c3722650 ...
@sql_type="uuid", @type=:uuid, @null=false, @default=nil, @default_function="uuid_generate_v4()", @collation=nil, @comment=nil>
schema.rb
还包含null: false
:
t.uuid "uuid", default: -> { "uuid_generate_v4()" }, null: false