Validation 如何验证rails中的唯一对
因此,我有一个具有以下值的表:Validation 如何验证rails中的唯一对,validation,activerecord,ruby-on-rails-3.2,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行已经包含该关系。您可以使用
--------------
| id | a | b |
--------------
| 1 | 1 | 2 |
| 2 | 3 | 4 |
| 3 | 5 | 6 |
| 4 | 7 | 8 |
--------------
如果已经存在两个值的任何配对,如何在rails中编写验证以防止保存新记录
重要提示:我不是说相同属性的值的配对,而是两种可能的配对。例如,在上面的表中,我应该能够保存
:a=>6,:b=>5
,因为第3行已经包含该关系。您可以使用范围验证多个唯一性
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}
将通过{a:7,b:8}
,但在此解决方案中,您将同时插入{a:7,b:8}
和{a:8,b:7}
通过这种方式,使用上述验证规则,可以有效防止双向重复
这种做法已用于朋友关系案件。例如,你是User7,我是User8。如果我们成为朋友,必须添加两条以上记录。这样,当搜索你的朋友时,我就在那里。搜索我的朋友时,您也在那里。您可以使用范围验证多个唯一性
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}
将通过{a:7,b:8}
,但在此解决方案中,您将同时插入{a:7,b:8}
和{a:8,b:7}
通过这种方式,使用上述验证规则,可以有效防止双向重复
这种做法已用于朋友关系案件。例如,你是User7,我是User8。如果我们成为朋友,必须添加两条以上记录。这样,当搜索你的朋友时,我就在那里。当搜索我的朋友时,你也在那里。正如我在问题中所说的(虽然可能不是特别措辞得体),这只会捕获我需要的50%。例如,如果存在a:1 b:2,它将捕获再次保存a:1 b:2的尝试,但不会捕获a:2 b:1。我想能够捕捉到这第二对以及感谢更新。编写一个自定义的验证器来验证记录的唯一性是否更经济?@BetjaminRichards,我认为编写这样的验证器是可能的。但这取决于您的业务逻辑。如果这样的验证对您很重要,那么双向查询在您的业务中也一定非常有用,那么为什么不将它们结合起来呢?我正在尝试修改这里的postgres graph guide:。我工作的基础是它是无向图。正如我在问题中所说的(虽然可能不是特别好的措辞),这将只捕获我需要的50%。例如,如果存在a:1 b:2,它将捕获再次保存a:1 b:2的尝试,但不会捕获a:2 b:1。我想能够捕捉到这第二对以及感谢更新。编写一个自定义的验证器来验证记录的唯一性是否更经济?@BetjaminRichards,我认为编写这样的验证器是可能的。但这取决于您的业务逻辑。如果这样的验证对您很重要,那么双向查询在您的业务中也一定非常有用,那么为什么不将它们结合起来呢?我正在尝试修改这里的postgres graph guide:。我工作的基础是它是无向图。可能的重复