2011-08-09 3 views
3

私は1つの請求書に対して複数の投票を防ぐためにスコープ検証を使って以下のモンゴイドモデルを持っています。各投票は、ユーザーおよびグループに属している:スコープとbelongs_toとのモンゴイド検証一意性

 
    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 

、多くの埋め込みビル・クラス:票を

 
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 

ユーザーが法案に投票を追加するには、次の方法があります。これは、ユーザーが異なるグループ(「Ruby Coders」、「Women」など)と投票を関連付けることを可能にし、データベースが現在1つの請求書に対して複数回投票できることを除けば、うまくいきます。私は次のように働かせることができますか?

 
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 ':少なくとも1つのバリデーション(ArgumentError)を提供する必要があります – bonhoffer

+0

ドキュメントを読む際に、私はMonkeypatchingなしでカスタムバリデーターを見つけることができません。 validates_presence_ofを使用すると、そのバリデーターは起動して正常に動作します。 – bonhoffer

+0

申し訳ありませんが、タイプミスがあり、 'validates'が' validate'だったはずです。ドキュメント定義をもう一度見て、 'Bill'が' Bill'に埋め込まれていることに気がつきました。プレゼンスバリデータが正しく起動している場合は、一意性も失われます。新しいレコードを作成するときに、mongodbで実行されたクエリを投稿できますか? – rubish