所以我有一个包含以下值的表:
--------------
| id | a | b |
--------------
| 1 | 1 | 2 |
| 2 | 3 | 4 |
| 3 | 5 | 6 |
| 4 | 7 | 8 |
--------------
如果已经存在两个值的任何配对,我将如何在rails中编写验证以防止保存新记录。
重要提示:我不是在谈论相同属性的价值配对,而是两种可能的配对。例如,在上表中,我应该可以保存:a => 6, :b =>5
,因为第3行已经包含该关系。
答案 0 :(得分:5)
您可以使用范围来验证多个唯一性。
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。如果我们成为朋友,必须添加上述两条记录。通过这种方式,在搜索你的朋友时,我就在那里。在搜索我的朋友时,你也在那里。