ID полиморфной ассоциации, has_one и уникальность
У меня есть полиморфная ассоциация, где администратор и разработчик имеют пользователя (для общего механизма аутентификации)
Developer.rb
class Developer < ActiveRecord::Base
attr_accessible :skype_name
has_one :user, :as => :profile, :dependent => :destroy
accepts_nested_attributes_for :user
end
Admin.rb идентичен, но не добавляет никаких новых атрибутов
User.rb
class User < ActiveRecord::Base
attr_accessible :email, :name, :password, :password_confirmation, :profile_id, :profile_type
has_secure_password
belongs_to :profile, :polymorphic => true
before_save { |user| user.email = email.downcase }
... some validations for unique email and before_save stuff ...
end
Когда я создаю разработчиков или администраторов через консоль rails, User.profile_id всегда уникален и совпадает с только что созданным разработчиком или администратором. Это также похоже на диаграмму здесь
Если у меня есть пользователь с profile_type
знак равно Developer
и я хочу получить ссылку на разработчика, безопасно ли получить ссылку, позвонив Developer.find(u.profile_id)
, а так же для админов? А если нет, то как мне это безопасно сделать?
Это работает в данный момент, но я не уверен, что это просто удача, потому что мои столы маленькие.
1 ответ
Да. Быстрый ответ заключается в том, что, поскольку вы установили тип профиля "Разработчик", идентификатор профиля пользователя должен совпадать с идентификатором в таблице "Разработчик". Представьте на секунду, что у вас есть
Пользователь один
id: 1
name: Bob
profile_type: Developer
profile_id: 1
Пользователь Два
id: 2
name: Shelly
profile_type: Admin
profile_id: 1
Поскольку вы устанавливаете полиморфную ассоциацию, Rails выполняет всю работу за вас. Не нужно беспокоиться о конфликтах идентификаторов. Если, конечно, вы не измените пользователя два на
Обновленный пользователь два
id: 2
name: Shelly
profile_type: Developer
profile_id: 1
Тогда Rails не будет знать, что делать, если у вас два пользователя в качестве одного и того же разработчика.
И в таблице вашего разработчика и администратора вы должны найти
Таблица разработчиков
id: 1
skype_name Bob123
Таблица администратора
id: 1
skype_name Shelly78