Ruby on rails 两字段组合的唯一性

Ruby on rails 两字段组合的唯一性,ruby-on-rails,Ruby On Rails,我有一个a,b区域的模型。我想确保a和b的组合在表中是唯一的,因此a=1,b=2和a=2,b=1会引起冲突 我尝试了验证:a,:scope=>:b的唯一性,但它只确保没有两个 a=1,b=2行可以存在,我还想过滤掉a=2,b=1。谢谢您可能想看看 据我所知,内置的唯一性验证器不支持这一点。您必须为此编写自定义验证,例如: class MyModel < AR::Base validate :my_custom_validation def my_custom_validatio

我有一个a,b区域的模型。我想确保a和b的组合在表中是唯一的,因此a=1,b=2和a=2,b=1会引起冲突

我尝试了
验证:a,:scope=>:b的唯一性,但它只确保没有两个

a=1,b=2行可以存在,我还想过滤掉a=2,b=1。谢谢

您可能想看看

据我所知,内置的唯一性验证器不支持这一点。您必须为此编写自定义验证,例如:

class MyModel < AR::Base

  validate :my_custom_validation

  def my_custom_validation
    if self.class.where("(a = :a AND b = :b) OR (a = :b AND b = :a)", {:a => a, :b => b}).exists?
      errors.add(:a, :taken)
    end
  end
end
classmymodela,:b=>b})存在?
错误。添加(:a,:take)
结束
结束
结束

如果有任何记录具有(a=1和b=2)或(a=2和b=1),这将在属性
a
中添加一个验证错误。

我想说的是,这是不受开箱即用支持的。您应该只构建自己的验证方法。没有提到
a
b
是主键,因此可以声明一个唯一的键约束,以将此验证保留在数据库端。而且,这仍然可以像内置验证一样工作,而不是像yngum希望的那样。它仍然允许两行,其中一行a=1,b=2,另一行a=2,b=1