Postgres迁移uuid列类型,默认值不起作用

时间:2017-04-18 08:48:25

标签: ruby-on-rails postgresql ruby-on-rails-4

我的迁移是

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列类型是否有任何限制?

1 个答案:

答案 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