0

目前,我有我的羣組的has_many以下遷移:通過關聯:Rails的唯一約束模型+數據庫級和競爭條件

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 

以下模型和獨特的約束:

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

的唯一性驗證工作效果很好,但如果我的應用程序中的競爭線程導致競爭條件並且超過了應用程序級檢查呢?如何編寫遷移以防止在數據庫級別的用戶和組的連接表中出現重複行?

回答

2

您需要添加一個唯一索引

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

就是這樣?這是否會雙向工作,或者如果一個組添加用戶/用戶添加組? – Riptyde4

+1

是的,它是雙向的。 –

+1

順序對唯一性無關緊要,但只有在查詢第一列或兩者都查詢時才使用索引。這將用於'select * from user_groups where user_id = 1',但不適用於'select * from user_groups where group_id = 1'。 – Iceman