0

私は現在、私のリストユーザーグループのhas_manyのための次の移行を持っています。組合を通じて:Railsのユニーク制約モデル+データベースレベルと競合状態

class UserGroup < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :group 
    validates_uniqueness_of :user, :scope => :group, :message => :not_unique 
end 

class CreateUserGroups < ActiveRecord::Migration 
    def change 
    create_table :user_groups do |t| 
     t.integer :user_id, :null => false 
     t.integer :group_id, :null => false 
     t.timestamps null: false 
    end 
    end 
end 

次のモデルとユニーク制約付き一意性検証はうまくいっていますが、アプリケーションの競合するスレッドが競合状態を引き起こし、アプリケーションレベルのチェックを過ぎてしまった場合はどうすればよいですか?データベースレベルでユーザーとグループの結合表の重複行を保護するために移行を作成するにはどうすればよいですか?

答えて

2

あなたはそれを独自の指標

add_index :user_groups, [:user_id, :group_id], unique: true 
+0

を追加する必要がありますか?これは双方向的に動作しますか、またはグループがユーザー/ユーザーを追加してグループを追加した場合ですか? – Riptyde4

+1

はい、双方向です。 –

+1

順序は一意ではありませんが、索引は、最初の列で照会しているかどうか、またはその両方を照会する場合にのみ使用されます。これは 'select * from user_groups user_id = 1'では使用されますが、' select * from user_groups where group_id = 1'では使用されません。 – Iceman