我想在现有表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的实际状态。
答案 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