私は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
あなたが言ったことを試しましたが、/Users/Tim/.rvm/gems/[email protected]/gems/activemodel-3.1.0.rc5/lib/active_model/validations/validates.rb :87: 'validates ':少なくとも1つのバリデーション(ArgumentError)を提供する必要があります – bonhoffer
ドキュメントを読む際に、私はMonkeypatchingなしでカスタムバリデーターを見つけることができません。 validates_presence_ofを使用すると、そのバリデーターは起動して正常に動作します。 – bonhoffer
申し訳ありませんが、タイプミスがあり、 'validates'が' validate'だったはずです。ドキュメント定義をもう一度見て、 'Bill'が' Bill'に埋め込まれていることに気がつきました。プレゼンスバリデータが正しく起動している場合は、一意性も失われます。新しいレコードを作成するときに、mongodbで実行されたクエリを投稿できますか? – rubish