2013-04-19 2 views
0

Я пытаюсь следовать совету в Mongoid 3 - Check for uniqueness of composite key, чтобы иметь модель с уникальным ограничением на 2 поля.Mongoid Unique Constraint on Composite Key

Декларация идентификатор заключается в следующем:

field :_id, type: String, default: &method(:generate_id) 

private 

    def generate_id 
    user.id.to_s + offering.id.to_s 
    end 

Но если я это сделаю, то есть приступ гнева, когда я создаю экземпляр объекта с помощью нового, потому что он пытается создать идентификатор, прежде чем он имеет пользователя и предложение и его (правильно) не хочет использовать id из nil. Я могу передать пользователю и предлагать в качестве параметров конструктора, и все в порядке.

Мой вопрос в том, является ли это правильным способом? Он чувствует себя грязным, учитывая всю тупую дурацку, которую я должен сделать, чтобы получить уникальное ограничение. Код не очень-то раскрывает вообще. Есть ли способ лучше?

ответ

7

С простым MongoDB вы можете создать этот индекс с JavaScript, как так (предполагается, что ваше имя коллекции регистрация):

db.registrations.ensureIndex({ "user_id": 1, "offering_id": 1 }, { unique: true }) 

Для создания этого индекса с Mongoid, добавить к вашей модели:

index({ user_id: 1, offering_id: 1 }, { unique: true }) 

И запустить rake db:mongoid:create_indexes.

Если вы хотите сохранить свой _id с помощью generate_id, вы можете переместить его на обратный вызов before_validate.

field :_id, type: String 

before_validate :generate_id 

private 

def generate_id 
    self._id ||= "#{user.id}:#{offering}" 
end 
+0

Это намного больше похоже на то, что я хочу, и код действительно отражает то, что я пытаюсь выполнить. Благодаря! –

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