Ruby on rails 实现验证:attr的唯一性作为基本错误

Ruby on rails 实现验证:attr的唯一性作为基本错误,ruby-on-rails,ruby-on-rails-3,validation,Ruby On Rails,Ruby On Rails 3,Validation,我想验证一个范围为other的属性,但由于它们在该验证中的作用相同,我不希望将错误分配给任何一个属性(但分配给基本错误) 我希望避免自定义验证,我希望: validates_uniqueness_of :attr, scope: [:attr1, :attr2], as: :base 我认为不需要对默认验证器进行子类化或MonkeyPatch就可以向:base添加错误,这将是一个更大的工作,然后编写一些自定义验证: validate :attr1_does_not_equal_attr2 d

我想验证一个范围为other的属性,但由于它们在该验证中的作用相同,我不希望将错误分配给任何一个属性(但分配给基本错误)

我希望避免自定义验证,我希望:

validates_uniqueness_of :attr, scope: [:attr1, :attr2], as: :base

我认为不需要对默认验证器进行子类化或MonkeyPatch就可以向
:base
添加错误,这将是一个更大的工作,然后编写一些自定义验证:

validate :attr1_does_not_equal_attr2

def attr1_does_not_equal_attr2
  errors.add(:base, 'attr1 should not equal attr2') if attr1 == attr2
end
不同的解决方案 假设您的
验证了
的唯一性,那么除了没有附加到
:base
的错误消息之外,代码工作正常

在验证后编写一个
,当在其中一个属性中检测到错误时设置一个基本错误,例如(未测试):


比那复杂一点。我需要验证整个数据库中属性的唯一性。并行解决方案应该是错误的。添加(:base,message)除非Model.where(attr1:attr1,attr2:attr2)。where(['id!=?',id])。存在?@sudo I添加了一个新的解决方案,如果您的验证已经是完美的,那么它应该可以工作,除了
:base
部分。
def after_validation
  if errors[:attr] || errors[:attr1] || errors[:attr2]
    errors.add(:base, 'Duplicate values detected')
  end
end