Rails添加唯一索引后创建Supplier失败,空值被判定为重复
Rails 中昵称(nickname)空值唯一性校验问题解决
我给应用创建了如下迁移文件,给suppliers表的nickname字段添加唯一索引:
class ChangeColumnsOnSuppliersAndStores < ActiveRecord::Migration[7.0] def change add_index :suppliers, :nickname, unique: true end end
之后尝试创建Supplier时,出现错误:
3.0.2 :010 > x.errors => #<ActiveModel::Errors [#<ActiveModel::Error attribute=nickname, type=taken, options={:value=>nil}>]>
错误提示nickname已存在,于是我又创建了一个迁移允许nickname字段为空:
class AllowNullOnNicknameOnSuppliers < ActiveRecord::Migration[7.0] def change change_column :suppliers, :nickname, :string, null: true end end
但错误依然存在。实际需求是:仅当nickname有值时才校验唯一性,空值不参与校验,但系统把null当成了不可重复的值。
查看我的Supplier模型,发现存在重复的验证规则:
class Supplier < ApplicationRecord has_many :products validates :name, presence: true validates_uniqueness_of :name validates_uniqueness_of :nickname validates :nickname, uniqueness: true, allow_nil: true def nome self.nickname.present? ? self.nickname : self.name end end
在朋友提示下找到问题所在:移除重复的验证规则,仅保留带allow_nil: true的validates_uniqueness_of即可:
class Supplier < ApplicationRecord has_many :products validates :name, presence: true validates_uniqueness_of :name validates_uniqueness_of :nickname, allow_nil: true # 移除下面这条重复的验证 # validates :nickname, uniqueness: true, allow_nil: true def nome self.nickname.present? ? self.nickname : self.name end end
现在问题已解决,功能正常运行。
内容的提问来源于stack exchange,提问作者Diogo Amaral
相关产品推荐
相关产品推荐

