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)
я не получаю сообщение об ошибке проверки. Вместо этого у меня две записи. Что я делаю не так?
Как быстро являются два создает казнены, если они увольняются сразу есть унаследуют состояние гонки здесь. Возможно, первоначальная запись кэшируется до того, как будет создана вторая проверка. Мое предложение состояло в том, чтобы установить множественное ключевое единственное ограничение в mongodb напрямую. 'db.foos.ensureIndex ({" day ": 1," year ": 1," month ": 1}, {unique: true})' –
Не сразу. Я могу подождать 30 секунд или даже несколько минут, и я все равно получаю дубликаты записей. Никакого условия гонки нигде. Я могу рассмотреть уникальное ограничение непосредственно в Мондодбе, в крайнем случае. Тем не менее, я надеюсь на способ сделать это через Mongoid (слой приложения). –
В процессе производства вы должны сделать то и другое, если получить удар с несколькими параллельными вставками, вы можете столкнуться с вышеуказанным состоянием гонки. Что касается проблемы, я не вижу ничего плохого синтаксически или логически. Возможная проблема: «Mongoid ведет себя немного иначе, чем Active Record при использовании #valid? по уже сохраненным данным. #valid активной записи? будут запускать все проверки, в то время как #valid Mongoid? будет выполняться только проверки документов, которые находятся в памяти в качестве оптимизации. 'http://mongoid.org/en/mongoid/docs/validation.html –