Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 不对称双柱上的唯一性_Ruby On Rails_Postgresql_Constraints_Unique Constraint - Fatal编程技术网

Ruby on rails 不对称双柱上的唯一性

Ruby on rails 不对称双柱上的唯一性,ruby-on-rails,postgresql,constraints,unique-constraint,Ruby On Rails,Postgresql,Constraints,Unique Constraint,这是我的表友谊(user\u id1:integer,user\u id2:integer) 我想向数据库添加一个约束,这样,如果其符号已经存在,就会拒绝几个用户id 例如,如果我在数据库中已经有了这对(42,17),我不想保存(17,42) 我正在将rails与postgresql一起使用。您可以在数据库中使用表达式索引执行此操作: create unique index unq_friendship_1_2 on (least(user_id1, user_id2), greate

这是我的表
友谊(user\u id1:integer,user\u id2:integer)

我想向数据库添加一个约束,这样,如果其符号已经存在,就会拒绝几个用户id

例如,如果我在数据库中已经有了这对
(42,17)
,我不想保存
(17,42)


我正在将rails与postgresql一起使用。

您可以在数据库中使用表达式索引执行此操作:

create unique index unq_friendship_1_2
     on (least(user_id1, user_id2), greatest(user_id1, user_id2));

我不知道如何在rails中表达这一点。

您可以在数据库中使用表达式索引来实现这一点:

create unique index unq_friendship_1_2
     on (least(user_id1, user_id2), greatest(user_id1, user_id2));

我不知道如何在rails中表达这一点。

如果您能够以某种方式实现应用程序,则可以使用普通唯一约束和检查约束的组合来实现这一点,即它将较小的值存储在字段user_id_1中,将较大的值存储在字段user_id_2中


在(用户\u id\u 1、用户\u id\u 2)上定义一个唯一约束,并另外定义一个检查约束(user_id_1如果能够以某种方式实现应用程序,则可以使用普通唯一约束和检查约束的组合来实现,即它将较小的值存储在字段user_id_1中,将较大的值存储在字段user_id_2中


在(user_id_1,user_id_2)上定义一个唯一的约束,并另外定义一个检查约束(user_id_1您可以在Rails中这样做)。 在rails模型
Friendly.rb
中,添加以下
验证\u唯一性
调用:

验证:user\u id1,:scope=>:user\u id2的唯一性。
这保证不会有两对相同的
user\u id1
s或
user\u id2
s

但是,他解释说,这种方法并不完全安全,因为如果同时发送两个请求,它们可能会被接受,并且您的行将被复制。他的解决方案是将以下迁移添加到您的友谊模型中:

class AddUniqueConstraints
您可以在Rails中这样做。 在rails模型
Friendly.rb
中,添加以下
验证\u唯一性
调用:

验证:user\u id1,:scope=>:user\u id2的唯一性。
这保证不会有两对相同的
user\u id1
s或
user\u id2
s

但是,他解释说,这种方法并不完全安全,因为如果同时发送两个请求,它们可能会被接受,并且您的行将被复制。他的解决方案是将以下迁移添加到您的友谊模型中:

class AddUniqueConstraints