唯一性验证不工作的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
我能够创建用户的页面和页面的多个用户,就好像验证是没有得到调用。
答
要触发验证在你需要使用一个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水平没有两个相同的行可以被创建。
您的意思是说,您可以使用相同的'page_id'和'user_id'创建多个成员资格记录? – max
也许我们在说同样的事情,但很难判断您是否期待验证的正确结果。您应该提供一个可重现的例子(例如来自Rails控制台),例如显示“2.times {Membership.create!(user:User.first,page:Page.first)}'的结果。 – max
我可以多次调用Page.users.create name:'user name'。 – francis