2011-08-09 55 views
3

我有以下mongoid模型,範圍驗證,以防止在一個賬單上的多個選票。每票屬於用戶和組:Mongoid驗證唯一性與範圍和belongs_to

 
class Vote 
    include Mongoid::Document 
    field :value, :type => Symbol # can be :aye, :nay, :abstain 
    field :type, :type => Symbol # TODO can delete? 

    belongs_to :user 
    belongs_to :polco_group 

    embedded_in :bill 
    validates_uniqueness_of :value, :scope => [:polco_group_id, :user_id, :type] 

end 

用戶有以下方法進行了表決添加到賬單:

 
    def vote_on(bill, value)  
    if my_groups = self.polco_groups # test to make sure the user is a member of a group 
     my_groups.each do |g| 
      # TODO see if already voted 
      bill.votes.create(:value => value, :user_id => self.id, :polco_group_id => g.id, :type => g.type) 
     end 
    else 
     raise "no polco_groups for this user" # #{self.full_name}" 
    end 
    end 

和嵌入許多法案類:票。這樣做的目的是允許用戶將他們的投票與不同的團體(「Ruby編碼」,「女性」等)相關聯,並且運行良好,除了數據庫目前允許用戶在一張賬單上多次投票。我如何獲得以下功能?

 
u = User.last 
b = Bill.last 
u.vote_on(b,:nay) 
u.vote_on(b,:nay) -> should return a validation error 

回答

1

最有可能的驗證器上Vote不會被解僱。您可以通過添加驗證功能並輸出內容或引發異常來確認。

class Vote 
    validate :dummy_validator_to_confirmation 

    def dummy_validator_to_confirmation 
    raise "What the hell, it is being called, then why my validations are not working?" 
    end 
end 

如果創建上述的驗證User#vote_on不會引發異常後,就已經證實回調不通過vote_on方法燒製Vote。您需要更改您的代碼以觸發Vote上的回調。也許改變它類似於以下,將有助於:

def vote_on(bill, value)  
    if my_groups = self.polco_groups # test to make sure the user is a member of a group 
    my_groups.each do |g| 
     # TODO see if already voted 
     vote = bill.votes.new(:value => value, :user_id => self.id, :polco_group_id => g.id, :type => g.type) 
     vote.save 
    end 
    else 
    raise "no polco_groups for this user" # #{self.full_name}" 
    end 
end 

上有mongoid GitHub上的問題跟蹤,使級聯回調到嵌入文檔的。現在回調只能在正在發生持久性操作的文檔上觸發。

+0

我試過你說的,但得到/Users/Tim/.rvm/gems/[email protected]/gems/activemodel-3.1.0.rc5/lib/active_model/validations/validates.rb :87:在'validates'中:您需要提供至少一個驗證(ArgumentError) – bonhoffer

+0

在閱讀文檔時,我無法找到沒有monkeypatching的自定義驗證器。如果我使用validates_presence_of,那麼驗證器會觸發並正常工作。 – bonhoffer

+0

對不起,有一個錯字,'validates'應該是'validate'。在再次查看文檔定義時,我注意到'Vote'嵌入在'Bill'中,它可能與此有關。如果存在驗證器正確觸發,唯一性也會被解僱。您可以在創建新記錄時發佈在mongodb上觸發的查詢嗎? – rubish