3

私はembeds_manyサブスクリプションを持つクラスSubscriberを持っています。サブスクリプションには属性ステータスがあります。サブスクライバーごとに 1 つのサブスクリプションのみが「アクティブ」ステータスになるように、ステータスの検証を追加したいと考えています。サブスクライバーは、ステータスが 'purchased' または 'expired' の複数のサブスクリプションを持つことができます。

4

1 に答える 1

2

これはそれを行う必要があります:

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
于 2012-10-20T22:24:12.240 に答える