レールの2つの列に一意のインデックスを実装する方法


95

テーブルがあり、2つの列に一意のインデックスを追加しようとしています。これらの列にもインデックスが付けられます。だから私の質問は、1つの列だけのインデックスを削除できるのか、それとも3つのインデックスすべてを使用する必要があるのか​​です。

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

5
補足として:MySQLを使用している場合、両方の列の一意のインデックスも持っている場合、used_idcontent_idを別々のインデックスに含めることは意味がありません。これはおそらく他のDBにも当てはまります...予想とは逆に、パフォーマンス(特に挿入/更新)に悪影響を及ぼします。
hurikhan77 2010年

回答:


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彼らは同じことですが、構文が違うだけです列を指定します。
フランソワボーソレイユ2010年

14
%w(user_id content_id)Rubyの@FrançoisBeausoleil は文字列の配列を作成するだけで、レールに特別なものではありません。"user_id content_id".split文字列の配列を作成しているのと同じことができます。私はあなたがこれを知っていると確信しています。このコメントは、他の読者がこれをRailsに誤って関連付けないようにするためのものです:)
Khaja Minhajuddin

テーブル作成時の構文はどのようになりますか?< -見つかった答え(stackoverflow.com/questions/4870961/...
tnaught

これを使用した後、私は奇妙な問題を抱えています。rake db:migrateを使用して新しい移行を実行できません。バージョン番号rake db:migrate:up VERSION = 20180411062714を使用して移行を実行できるのは、一度に1つのファイルのみです。2つの列で一意のtrueを実行したテーブルのデータはすでにありました。
thedudecodes

@FrançoisBeausoleilさて、実際には同じもので%w(user_id content_id)はなく、文字列の配列です。と同じ['user_id', 'content_id']です。Array of Symbolsの別の表記は%i(user_id content_id)、またはOPが書い[:user_id, :content_id]
Sasa Blagojevic
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.