Монгоидная эталонная уникальность - PullRequest
1 голос
/ 01 января 2011

У меня есть эта модель:

class Vote
  include Mongoid::Document
  include Mongoid::Timestamps

  field :vote, :type=>Integer

  embedded_in :voteable, :inverse_of => :votes
  referenced_in :user

  attr_accessible :vote, :user, :voteable

  validates :vote,:inclusion => [-1, 1]
  validates :user ,:presence=> true,:uniqueness=>true

end

Проблема в том, что проверка уникальности пользователя для каждого голоса не работает, и один и тот же пользователь может создать несколько голосов, а это не то, что мне нужно. Есть идеи, как это решить?

1 Ответ

2 голосов
/ 02 января 2011

Похоже, это известная проблема.

http://groups.google.com/group/mongoid/browse_thread/thread/e319b50d87327292/14ab7fe39337418a?lnk=gst&q=validates#14ab7fe39337418a

https://github.com/mongoid/mongoid/issuesearch?state=open&q=validates#issue/373

Можно написать собственную проверку для обеспечения уникальности.Вот быстрый тест:

class UserUniquenessValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    record.errors[attribute] << "value #{value} is not unique" unless is_unique_within_votes(record, attribute, value)
  end

  def is_unique_within_votes(vote, attribute, value)
    vote.voteable.votes.each do |sibling|
      return false if sibling != vote && vote.user == sibling.user
    end
    true
  end
end

class Vote
  ...
  validates :user ,:presence => true, :user_uniqueness => true
end
...