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行已经包含该关系.
您可以使用范围来验证多个唯一性.
validates_uniqueness_of :a, scope: :b
Run Code Online (Sandbox Code Playgroud)
鉴于[{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.如果我们成为朋友,必须添加上述两条记录.通过这种方式,在搜索你的朋友时,我就在那里.在搜索我的朋友时,你也在那里.