Rails唯一约束模型+数据库级别和竞争条件

时间:2017-04-07 22:40:26

标签: mysql ruby-on-rails postgresql activerecord rails-migrations

我目前为我的UserGroups has_many进行了以下迁移:通过关联:

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

唯一性验证工作得很好,但是如果我的应用程序中的竞争线程导致竞争条件并且通过应用程序级别检查会怎样?如何编写迁移以防止数据库级别的用户和组在连接表中出现重复行?

1 个答案:

答案 0 :(得分:2)

您需要添加唯一索引

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