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
Другие вопросы по тегам