【问题标题】:Validating embedded document in Mongoid based on embedded attribute基于嵌入属性验证 Mongoid 中的嵌入文档
【发布时间】:2012-10-20 04:50:47
【问题描述】:

我有一个有 embeds_many 订阅的类订阅者。订阅具有属性状态。我想添加对状态的验证,以便每个订阅者只有一个订阅可以具有“活动”状态。订阅者可以拥有多个状态为 'purchased' 或 'expired' 的订阅。

【问题讨论】:

  • 那么,你的问题是什么?

标签: mongoid


【解决方案1】:

应该这样做:

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

但请确保您始终在订阅者上调用 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多