我在尝试创建聊天加入表时遇到问题。其中有两个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。
答案 0 :(得分:0)
执行此操作的usual way是create 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