根据嵌入属性在Mongoid中验证嵌入文档

问题描述:

我有一个拥有embeds_many订阅的订阅者类。订阅有一个属性状态。我想添加状态验证,以便每个订阅者只有一个订阅可以具有“活动”状态。订户可以有多个订阅状态为“已购买”或“过期”。根据嵌入属性在Mongoid中验证嵌入文档

+0

那么,什么是你的问题呢? – Nippey

这应做到:

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 

但要确保你总是叫节省用户,否则验证将不会触发对用户,你会处于不一致的国有土地。在不一致的状态,你可能会看到失败验证后

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

如果您还需要验证订阅,节省用户的时候,你级联回调:

embeds_many :subscriptions, cascade_callbacks: true