gpt4 book ai didi

ruby-on-rails - Rails/PostgreSQL - 如何验证只能有两个用户 ID 的一种组合?

转载 作者:行者123 更新时间:2023-11-29 13:47:09 26 4
gpt4 key购买 nike

我在尝试创建聊天加入表时遇到问题。里面有两个user_id,user_id1和user_id2。我可以得到 user_id1 为 1 和 user_id2 为 2 时的唯一性验证;无法使用这些确切属性创建更多聊天。但我正在执行匹配搜索,所以有时会出现 user_id1 为 2 且 user_id2 为 1 的匹配项,这是一个问题。

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

长话短说:

a = 1, b = 2

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

最佳答案

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

关于ruby-on-rails - Rails/PostgreSQL - 如何验证只能有两个用户 ID 的一种组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46432891/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com