2012-10-20 4 views
3

embeds_many Subscriptions가있는 클래스 구독자가 있습니다. 구독에는 속성 상태가 있습니다. 하나의 Subscription 만 구독자 당 '활성'상태를 가질 수 있도록 상태에 대한 유효성 검사를 추가하고 싶습니다. 가입자는 '구매 됨'또는 '만료 됨'상태의 여러 구독을 가질 수 있습니다.임베디드 애트리뷰트에 기반한 몽고 이드의 임베디드 문서 유효성 검사

class Subscriber 
    include Mongoid::Document 
    embeds_many :subscriptions 
    validate :active_subscriptions 

    def active_subscriptions 
    self.errors.add(:base, 'too many active subscriptions') if 
     subscriptions.where(status: 'active').count > 1 
    end 
end 

class Subscription 
    include Mongoid::Document 
    embedded_in :subscriber 
    field :status, class: 'String' 
end 

s = Subscriber.create 
s.subscriptions.build(status: 'active') 
s.save # fires validations on subscriber 
s.subscriptions.build(status: 'active') 
s.save # wouldn't save 

을하지만 당신은 항상 가입자에 저장 전화 있는지 확인하십시오, 그렇지 않으면 검증 가입자에 발생하지 않습니다 그리고 당신은 일관성없는 상태로 착륙합니다

+0

, 당신의 질문은 다음 무엇을 : 일관성이없는 상태에서는 검증 당신은 또한 가입, 가입자를 저장, 당신 계단식 콜백을 확인해야 할 경우 나중에

s = Subscriber.create s.subscriptions.create(status: 'active') # fires validations on subscription only s.subscriptions.build(status: 'active').save # fires validations on subscription only 

참조 실패 하는가? – Nippey

답변

2

이 그것을해야한다.

그래서
embeds_many :subscriptions, cascade_callbacks: true 
관련 문제