Rails迁移 - 添加唯一索引,允许跳过空值

时间:2018-01-05 11:09:26

标签: ruby-on-rails psql

我想在现有表psql

中向列name添加唯一约束

创建表(PostgreSQL):

class CreateRequests < ActiveRecord::Migration
  def change
    create_table :requests do |t|
      t.integer :user_id
      t.string :name
      t.string :address
      t.timestamps null: true
    end
    add_index :requests, :user_id
  end
end

所以我在模型中添加了验证唯一性

class Request < ModelBase
  belongs_to :user
  validates :user, presence: true
  validates :name, uniqueness: true, allow_blank: true
  ...

和这样的迁移:

def change
    add_index :user_requests, :name, unique: true
end

但我注意到在某些情况下name可以为空可以add_index条件:name是null / not null吗?

编辑:是的,我希望这些空值保留在数据库中(我不需要修改过去的请求)。我认为我需要编辑迁移以更准确地了解db的实际状态。

5 个答案:

答案 0 :(得分:0)

使得唯一性的正确格式

validates :name, presence: true, uniqueness: {case_sensitive: false},format: { without: /\s/,message: 'is invalid (spaces are not allowed)'}

答案 1 :(得分:0)

您可以尝试验证here

validates :name, presence: true, uniqueness: true,

其中,在线状态:真实将验证是否为空,唯一性:true 将验证用户的唯一名称。

答案 2 :(得分:0)

使用以下

validates :name, uniqueness: true, if: 'name.present?'

索引可能是你试试

add_index :user_requests, :name, unique: true, where: 'name IS NOT NULL'

答案 3 :(得分:0)

没有人回答所以我正在添加我的解决方案 迁移应该是这样的:

def change
    add_index :user_requests, :name, unique: true, where: 'name IS NOT NULL'
end

(验证仍然是: validates :name, uniqueness: true, allow_blank: true

答案 4 :(得分:-1)

也添加presence: true

validates :name, uniqueness: true, presence: true

您可以在迁移中添加默认值,例如

class AddDefaultToRequests < ActiveRecord::Migration
  def up
    change_column :requests, :name, default: ''
  end

  def down
    change_column :requests, :name
  end
end