唯一性验证不适用于 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
这确保在数据库级别上不会创建两个相同的行。
型号
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
这确保在数据库级别上不会创建两个相同的行。