Rails 3 и Mongoid: проверка встроенных документов - PullRequest
2 голосов
/ 20 февраля 2012

Итак, у меня возникли проблемы с аутентификацией пользователя во встроенных документах. У меня есть два документа, один вложен в другой. Бизнес имеет много членов. Модели выглядят так:

class Member
  include Mongoid::Document

  field :username,        type: String
  field :password,           type: String
  embedded_in :business

  validates :username,  :presence => true, :uniqueness => true, :length => 5..60
end

class Business
  include Mongoid::Document

  field :name,            type: String
  embeds_many :members
end

Проблема в том, что он не проверяет уникальность имени пользователя в каждой модели. Когда я сохраняю участника в компании, я могу сохранить тысячу с тем же именем. Это, конечно, не будет работать для хорошей системы аутентификации. Я использую Mongoid 2, Rails 3 и Ruby 1.9

1 Ответ

7 голосов
/ 20 февраля 2012

Это нормальное поведение при использовании встроенных документов, как описано здесь: Проверка MongoID

validates_uniqueness_of

Проверка того, что поле является уникальным в базе данных:Обратите внимание, что для встроенных документов это будет проверять только то, что поле уникально в контексте родительского документа, а не всей базы данных.

Я думаю, вы хотите попытаться создать индекс в имени пользователяполе, которое обеспечит уникальность среди всех объектов этой коллекции.Примерно так:

ensureIndex({username:1},{unique:true}); 

РЕДАКТИРОВАТЬ : если вы хотите, чтобы Mongo выдавало исключение, если существует документ с таким же индексным значением, вы должны избегать Mongo, чтобы выполнить «выстрел и забыть»шаблон.Это означает, что база данных не будет ожидать ответа при выполнении операции обновления / записи для документа.

И вы хотите передать этот параметр: safe:true.При этом Монго должен вызвать исключение, если по какой-либо причине документ не может быть вставлен.

...