根据嵌入属性在Mongoid中验证嵌入文档
问题描述:
我有一个拥有embeds_many订阅的订阅者类。订阅有一个属性状态。我想添加状态验证,以便每个订阅者只有一个订阅可以具有“活动”状态。订户可以有多个订阅状态为“已购买”或“过期”。根据嵌入属性在Mongoid中验证嵌入文档
答
这应做到:
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
那么,什么是你的问题呢? – Nippey