postgres(Rails)中数组列的唯一索引

时间:2013-12-10 00:10:51

标签: postgresql validation activerecord ruby-on-rails-4 indexing

我有一个数组列,它是rails中唯一验证的一部分。

这是一个包含a,b,c,d,e。

列的表格

验证:  validates_uniqueness_of:d,范围:[:a,:b]

现在因为我有多个rails服务器,所以表中有时会有重复的行,因为没有DB级别的约束。更多信息:http://robots.thoughtbot.com/the-perils-of-uniqueness-validations/

所以, 我试图在表上添加一个唯一的索引,如下所示:  add_index:table,[“a”,“b”,“d”],唯一:true,使用:: gin

我正在使用杜松子酒。看到 http://www.postgresql.org/docs/current/static/gin-intro.html Can PostgreSQL index array columns?

然而,

在执行db:migrate之后,我仍然可以添加重复的行。我假设这是因为数组上的唯一索引不起作用。

任何指针?

谢谢!

  • 我正在使用Rails4
  • 规范化表格当前不是一个选项

1 个答案:

答案 0 :(得分:1)

最好我知道,Postgres只会使用btree索引强制执行唯一约束。因此,您的索引创建代码要么默默地失败,要么默默地忽略其定义的唯一部分。

另一个要考虑的问题是array[1,2,3] <> array[3,2,1]就Postgres而言。为了确保正确的唯一性验证,您可能还希望对数组强制执行约束,以便拒绝未排序的值。

(更好的是,你应该正确地规范你的数据,以避免使用这样的数组开始,但我离题......这完全是另一个话题。)