2013-05-16 3 views
2

У меня есть:Как проверить уникальность с областью?

class Foo 
    include Mongoid::Document 

    field :year, :type => Integer, :default => Time.now.utc.year 
    field :month, :type => Integer, :default => Time.now.utc.month 
    field :day, :type => Integer, :default => Time.now.utc.day 

    validates :day, :uniqueness => { :scope => [:month,:year] } 
end 

я делаю следующее дважды:

Foo.create(:day => 24, :year => 2013, :month => 5) 

я не получаю сообщение об ошибке проверки. Вместо этого у меня две записи. Что я делаю не так?

+1

Как быстро являются два создает казнены, если они увольняются сразу есть унаследуют состояние гонки здесь. Возможно, первоначальная запись кэшируется до того, как будет создана вторая проверка. Мое предложение состояло в том, чтобы установить множественное ключевое единственное ограничение в mongodb напрямую. 'db.foos.ensureIndex ({" day ": 1," year ": 1," month ": 1}, {unique: true})' –

+0

Не сразу. Я могу подождать 30 секунд или даже несколько минут, и я все равно получаю дубликаты записей. Никакого условия гонки нигде. Я могу рассмотреть уникальное ограничение непосредственно в Мондодбе, в крайнем случае. Тем не менее, я надеюсь на способ сделать это через Mongoid (слой приложения). –

+0

В процессе производства вы должны сделать то и другое, если получить удар с несколькими параллельными вставками, вы можете столкнуться с вышеуказанным состоянием гонки. Что касается проблемы, я не вижу ничего плохого синтаксически или логически. Возможная проблема: «Mongoid ведет себя немного иначе, чем Active Record при использовании #valid? по уже сохраненным данным. #valid активной записи? будут запускать все проверки, в то время как #valid Mongoid? будет выполняться только проверки документов, которые находятся в памяти в качестве оптимизации. 'http://mongoid.org/en/mongoid/docs/validation.html –

ответ

Смежные вопросы