Validation 如何验证rails中的唯一对

Validation 如何验证rails中的唯一对,validation,activerecord,ruby-on-rails-3.2,Validation,Activerecord,Ruby On Rails 3.2,因此,我有一个具有以下值的表: -------------- | id | a | b | -------------- | 1 | 1 | 2 | | 2 | 3 | 4 | | 3 | 5 | 6 | | 4 | 7 | 8 | -------------- 如果已经存在两个值的任何配对,如何在rails中编写验证以防止保存新记录 重要提示:我不是说相同属性的值的配对,而是两种可能的配对。例如,在上面的表中,我应该能够保存:a=>6,:b=>5,因为第3行已经包含该关系。您可以使用

因此,我有一个具有以下值的表:

--------------
| id | a | b |
--------------
|  1 | 1 | 2 |
|  2 | 3 | 4 |
|  3 | 5 | 6 |
|  4 | 7 | 8 |
--------------
如果已经存在两个值的任何配对,如何在rails中编写验证以防止保存新记录


重要提示:我不是说相同属性的值的配对,而是两种可能的配对。例如,在上面的表中,我应该能够保存
:a=>6,:b=>5
,因为第3行已经包含该关系。

您可以使用范围验证多个唯一性

validates_uniqueness_of :a, scope: :b
给定
[{a:5,b:6},{a:7,b:8}]
存在。对于以下新值:

  • {a:7,b:9}
    将通过
  • {a:7,b:8}
    不允许
  • {a:8,b:7}
    将通过
  • 下面是关于双向唯一性的进一步问题,即不允许#3数据传递

    据我所知,我不知道这样的直接验证规则

    但对于这种情况,这里有一个很好的解决方法,即在一个事务中插入两条记录。

    例如,最初要保存的值是
    {a:7,b:8}
    ,但在此解决方案中,您将同时插入
    {a:7,b:8}
    {a:8,b:7}

    通过这种方式,使用上述验证规则,可以有效防止双向重复


    这种做法已用于朋友关系案件。例如,你是User7,我是User8。如果我们成为朋友,必须添加两条以上记录。这样,当搜索你的朋友时,我就在那里。搜索我的朋友时,您也在那里。

    您可以使用范围验证多个唯一性

    validates_uniqueness_of :a, scope: :b
    
    给定
    [{a:5,b:6},{a:7,b:8}]
    存在。对于以下新值:

  • {a:7,b:9}
    将通过
  • {a:7,b:8}
    不允许
  • {a:8,b:7}
    将通过
  • 下面是关于双向唯一性的进一步问题,即不允许#3数据传递

    据我所知,我不知道这样的直接验证规则

    但对于这种情况,这里有一个很好的解决方法,即在一个事务中插入两条记录。

    例如,最初要保存的值是
    {a:7,b:8}
    ,但在此解决方案中,您将同时插入
    {a:7,b:8}
    {a:8,b:7}

    通过这种方式,使用上述验证规则,可以有效防止双向重复


    这种做法已用于朋友关系案件。例如,你是User7,我是User8。如果我们成为朋友,必须添加两条以上记录。这样,当搜索你的朋友时,我就在那里。当搜索我的朋友时,你也在那里。

    正如我在问题中所说的(虽然可能不是特别措辞得体),这只会捕获我需要的50%。例如,如果存在a:1 b:2,它将捕获再次保存a:1 b:2的尝试,但不会捕获a:2 b:1。我想能够捕捉到这第二对以及感谢更新。编写一个自定义的验证器来验证记录的唯一性是否更经济?@BetjaminRichards,我认为编写这样的验证器是可能的。但这取决于您的业务逻辑。如果这样的验证对您很重要,那么双向查询在您的业务中也一定非常有用,那么为什么不将它们结合起来呢?我正在尝试修改这里的postgres graph guide:。我工作的基础是它是无向图。正如我在问题中所说的(虽然可能不是特别好的措辞),这将只捕获我需要的50%。例如,如果存在a:1 b:2,它将捕获再次保存a:1 b:2的尝试,但不会捕获a:2 b:1。我想能够捕捉到这第二对以及感谢更新。编写一个自定义的验证器来验证记录的唯一性是否更经济?@BetjaminRichards,我认为编写这样的验证器是可能的。但这取决于您的业务逻辑。如果这样的验证对您很重要,那么双向查询在您的业务中也一定非常有用,那么为什么不将它们结合起来呢?我正在尝试修改这里的postgres graph guide:。我工作的基础是它是无向图。可能的重复