2012-10-20 62 views
3

我有一個擁有embeds_many訂閱的訂閱者類。訂閱有一個屬性狀態。我想添加狀態驗證,以便每個訂閱者只有一個訂閱可以具有「活動」狀態。訂戶可以有多個訂閱狀態爲「已購買」或「過期」。根據嵌入屬性在Mongoid中驗證嵌入文檔

+0

那麼,什麼是你的問題呢? – Nippey

回答

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