[英]Rails validating uniqueness of polymorphic association
我有以下几点:
class Membership < ApplicationRecord
belongs_to :member, polymorphic: true
belongs_to :group, polymorphic: true
end
如您所见,我的Membership模型是双重多态的。 我想验证:group
的唯一性:member
。
我希望以下方法能起作用:
validates :member, uniqueness: { scope: :group }
但这会导致错误:
NameError: uninitialized constant Membership::Member
有Rails的方式可以做到这一点,还是我需要为此编写一个自定义方法?
validates :member_id, :uniqueness => { :scope => [:member_type, :group_id,:group_type] }
这样,您可能还希望使成员和组都必须存在,因为nil值将导致重复并且将使唯一性验证失败
validates :member_type, :member_id, :presence => true
validates :group_type, :group_id, :presence => true
我使用了罗汉的答案,但为group_id
添加了另一个验证
validates :group_id, uniqueness: { :scope => [:group_type, : member_id,: member_type] }
validates :member_id, uniqueness: { :scope => [:member_type, : group_id,: group_type] }
我还添加了一个数据库索引
add_index :memberships, [:group_id, :group_type, :member_id, :member_type], unique: true
我结束了这个。 ( on: :create
允许更新)
validate :group_member_uniqueness, on: :create
def group_member_uniqueness
if Membership.where(group: group, member: member).exists?
errors[:base] << 'That has already been added'
end
end
数据库索引
add_index :memberships, [:group_id, :group_type, :member_id, :member_type], unique: true
没有内置的功能,所以我做了以下工作:
validate :member_is_unique_for_group
def member_is_unique_for_group
if group.members.include? member
errors.add(:member, 'already exists for this group')
end
end
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.