模型
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
这确保在数据库级别上不能创建两个相同的行。
关于ruby-on-rails - 唯一性验证不适用于 has_many :though association on rails 5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46446937/