唯一性验证不适用于 has_many:尽管关联 rails 5

Uniqueness validation not working on has_many :though association on rails 5

型号

class User < ApplicationRecord
    has_many :memberships
    has_many :pages, through: :memberships 
end

class Page < ApplicationRecord
    has_many :memberships
    has_many :users, through: :memberships 
end

class Membership < ApplicationRecord
    belongs_to :user
    belongs_to :page

    validates :page_id, uniqueness: { scope: :user_id}
end

我能够在页面上和用户页面上创建多个用户,就像没有调用验证一样。

要在关联模型中触发验证,您需要使用 validates_associated:

class User < ApplicationRecord
  has_many :memberships
  has_many :pages, through: :memberships
  validates_associated :memberships
end

class Page < ApplicationRecord
  has_many :memberships
  has_many :users, through: :memberships
  validates_associated :memberships
end

class Membership < ApplicationRecord
  belongs_to :user
  belongs_to :page
  validates :page_id, uniqueness: { scope: :user_id}
end

这可能是一个真正的问题,因为在隐式创建关联时不会调用关联验证。

此外,创建一个复合数据库索引是个好主意,它可以防止 possible race conditions:

class AddCompoundIndexToMemberships < ActiveRecord::Migration[5.0]
  def change
    add_index :memberships, [:page_id, :user_id], unique: true
  end
end

这确保在数据库级别上不会创建两个相同的行。