如何验证rails中的唯一对

时间:2013-05-23 14:46:52

标签: 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行已经包含该关系。

1 个答案:

答案 0 :(得分: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}将通过
  4. 所以这里有关于双向唯一性的进一步问题,即你不允许#3数据通过。

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

    但这是针对此案例的一个很好的解决方法,即您在一个交易中插入两条记录。

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

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

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