Rails / PostgreSQL - 如何验证只有两个用户ID的组合?

时间:2017-09-26 17:51:48

标签: ruby-on-rails postgresql validation activerecord

我在尝试创建聊天加入表时遇到问题。其中有两个user_id,user_id1和user_id2。当user_id1为1且user_id2为2时,我可以获得唯一性验证;不再可以使用这些确切的属性创建聊天。但是我正在进行匹配搜索,所以有时匹配会出现user_id1为2且user_id2为1的情况,这是一个问题。

我一直在数据库级别上搜索这两者之间的唯一性约束,而我似乎找不到任何约束。我认为对于模型级别,我必须创建一个自定义验证,我可以弄清楚,但有没有办法在数据库级别执行此操作?或者有更好的方法来解决这个问题吗?提前谢谢。

tl;博士:

a = 1,b = 2

我需要约束b = 1,a = 2。

1 个答案:

答案 0 :(得分:0)

执行此操作的usual waycreate an index on an expression并使用greatest and least函数构建一个忽略列顺序的表达式。在您的情况下,您需要这样的索引:

create unique index whatever_you_want_to_call_it
on your_table(greatest(user_id1, user_id2), least(user_id1, user_id2))

我不知道有什么方法可以让ActiveRecord构建这样的索引,也不会存储在schema.rb中。解决这些问题的方法是切换到SQL架构并在迁移中手动创建索引。要从db/schema.rb切换到db/structure.sql,请更新config/application.rb中的设置:

config.active_record.schema_format = :sql

然后在迁移中创建索引:

def up
  connection.execute(%q{
    create unique index whatever_you_want_to_call_it
    on your_table(greatest(user_id1, user_id2), least(user_id1, user_id2))
  })
end

然后你可以抛弃你的db/schema.rb(因为它将不再使用)并开始使用db/structure.sql。您还需要开始使用不同的rake任务:

  • db:structure:dump代替db:schema:dump
  • db:structure:load代替db:schema:load