2013-02-26 3 views
5

У меня есть следующие:Rails один-к-одному

class User < ActiveRecord::Base 
    has_one :car, :class_name => 'Car', :foreign_key => 'user_id' 

class Car < ActiveRecord::Base 
    belongs_to :worker, :class_name => 'User', :foreign_key => 'user_id' 

Это в основном отношения один-к-одному между пользователем и автомобилем.

Я хочу, чтобы Пользователь имел возможность иметь один и только один автомобиль. Это подразумевает тот факт, что, если он создает автомобиль, назначенный ему, он не сможет создать вторую.

Как это можно сделать?

+0

здесь http://rubyonrailsthrissur.wordpress.com/2012/07/19/one-to-one-relation-in-rails/ наиболее практичное объяснение – montells

ответ

2

Почему бы вам просто не попробовать, прежде чем пользователь попытается добавить автомобиль?

if worker.car 
raise "sorry buddy, no car for you" 
else 
car = Car.create(user_id: worker.id) 
end 
+0

Большое спасибо, это работает. – cgf

14

Существует, конечно, несколько различных способов достижения этого. Я бы предложил создать составной индекс ключа в этой таблице, чтобы гарантировать, что user_id уникален в таблице. Это гарантирует, что он будет присутствовать только один раз. При миграции вы могли бы написать что-то вроде этого.

add_index(:cars, :worker_id, :unique => true) 

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

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

В дополнение к этому решению вы хотите добавить валидацию к самой модели автомобиля.

validates_uniqueness_of :worker_id, message: "can not have more than one car" 

Вы увидите, как эта ошибка встречается с чем-то вроде «Идентификатор рабочего не может иметь более одного автомобиля». Скорее всего, вы захотите настроить раздел «Идентификатор рабочего». Обратитесь к этому разделу post за инструкциями о том, как это сделать.

Вам, конечно же, не нужно ограничивать db, но в случае, если кто-то еще вставляет в БД, это хорошая идея. В противном случае у вас будут «недопустимые» данные в отношении Rails.

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