[英]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.