簡體   English   中英

Rails驗證多態關聯的唯一性

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM