如何在Rails的两列上实现唯一索引


95

我有一张桌子,我想在两列上添加唯一索引。这些列也被索引。所以我的问题是我是否可以删除仅用于一列的索引,或者是否必须使用所有三个索引:

add_index "subscriptions", ["user_id"]
add_index "subscriptions", ["content_id"]
add_index "subscriptions", ["user_id"], ["content_id"], :unique => true

5
附带说明:如果您使用的是MySQL,则同时具有两列的唯一索引时,将您的索引used_idcontent_id单独的索引分开是没有意义的。这可能也适用于其他数据库...与您期望的相反,它将对性能(尤其是插入/更新)产生负面影响。
hurikhan77 2010年

Answers:


186
add_index :subscriptions, [:user_id, :content_id], unique: true

6
还有其他语法:add_index:subscriptions,[:user_id,:content_id],:unique => true add_index:subscriptions,%w(user_id content_id),:unique => true它们是同一件事,只是语法不同用于指定列。
弗朗索瓦·博索莱尔

14
%w(user_id content_id)红宝石中的@FrançoisBeausoleil 只会创建一个字符串数组,这对rails并不特殊。您可以使用相同的"user_id content_id".split方法来创建字符串数组。我敢肯定,您知道这一点,是因为其他
人才不会误将

创建表时的语法是什么?< -发现答案(stackoverflow.com/questions/4870961/...
tnaught

使用此后,我有奇怪的问题。无法使用rake db:migrate运行任何新迁移。只能使用版本号rake db:migrate:up VERSION = 20180411062714一次运行一个文件。我已经在表格上获得了数据,在这两列上我做了独一无二的判断。
thedudecodes

@FrançoisBeausoleil好吧,实际上它们不是一回事,%w(user_id content_id)是一个字符串数组。与相同['user_id', 'content_id']。用于符号的阵列的不同表示法是%i(user_id content_id),或者作为OP写[:user_id, :content_id]
萨·布拉戈赫维奇
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.