如何验证rails中的唯一对

Bet*_*rds 0 validation activerecord ruby-on-rails-3.2

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

--------------
| id | a | b |
--------------
|  1 | 1 | 2 |
|  2 | 3 | 4 |
|  3 | 5 | 6 |
|  4 | 7 | 8 |
--------------
Run Code Online (Sandbox Code Playgroud)

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

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

Bil*_*han 5

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

validates_uniqueness_of :a, scope: :b
Run Code Online (Sandbox Code Playgroud)

鉴于[{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.如果我们成为朋友,必须添加上述两条记录.通过这种方式,在搜索你的朋友时,我就在那里.在搜索我的朋友时,你也在那里.