唯一性验证不工作的has_many:虽然联想在轨道上5种

问题描述:

模式唯一性验证不工作的has_many:虽然联想在轨道上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 

我能够创建用户的页面和页面的多个用户,就好像验证是没有得到调用。

+0

您的意思是说,您可以使用相同的'page_id'和'user_id'创建多个成员资格记录? – max

+0

也许我们在说同样的事情,但很难判断您是否期待验证的正确结果。您应该提供一个可重现的例子(例如来自Rails控制台),例如显示“2.times {Membership.create!(user:User.first,page:Page.first)}'的结果。 – max

+0

我可以多次调用Page.users.create name:'user name'。 – francis

要触发验证在你需要使用一个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 

这确保在DB水平没有两个相同的行可以被创建。