Я не верю, что это возможно со встроенными документами.Я столкнулся с той же проблемой, что и вы, и единственный найденный мной обходной путь - это использование ссылочного документа вместо встроенного документа, а затем создание составного индекса для ссылочного документа.
Очевидно, что проверка уникальности не выполняется 'достаточно, поскольку это не защищает от условий гонки.Еще одна проблема, с которой я столкнулся с уникальными индексами, заключалась в том, что стандартное поведение mongoid - не вызывать ошибок, если проверка прошла успешно, а база данных отказалась принять документ.Мне пришлось изменить следующий параметр конфигурации в mongoid.yml:
persist_in_safe_mode: true
Это задокументировано в http://mongoid.org/docs/installation/configuration.html
Наконец, после внесения этого изменения методы сохранения / создания начнут выдаватьошибка, если база данных отказывается хранить документ.Итак, вам нужно что-то вроде этого, чтобы иметь возможность рассказать пользователям о том, что произошло:
alias_method :explosive_save, :save
def save
begin
explosive_save
rescue Exception => e
logger.warn("Unable to save record: #{self.to_yaml}. Error: #{e}")
errors[:base] << "Please correct the errors in your form"
false
end
end
Даже это не очень хороший вариант, потому что вам остается угадывать, какие поля действительно вызвалиошибка (и почему).Лучшим решением было бы заглянуть внутрь MongoidError и создать соответствующее сообщение об ошибке соответственно.Вышесказанное подходит для моего заявления, поэтому я не зашел так далеко.