0

所以我有一个包含以下值的表:

--------------
| id | a | b |
--------------
|  1 | 1 | 2 |
|  2 | 3 | 4 |
|  3 | 5 | 6 |
|  4 | 7 | 8 |
--------------

如果两个值的任何配对已经存在,我将如何在 rails 中编写验证以防止保存新记录。

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

4

1 回答 1

5

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

validates_uniqueness_of :a, scope: :b

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

  1. {a: 7, b: 9}将通过
  2. {a: 7, b: 8}不允许
  3. {a: 8, b: 7}将通过

因此,关于双向唯一性的进一步问题出现了,即您不允许 #3 数据通过。

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

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

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

这样,利用上述验证规则,就可以有效防止双向重复。

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

于 2013-05-23T15:15:18.270 回答