Я внедрил аутентификацию в Facebook и Twitter в приложении, над которым я работаю, следуя отличным Railscasts по этой теме.
Пока что моя пользовательская модель подключена к Devise , и у меня есть встроенная модель аутентификации, и я записываю провайдеров аутентификации, когда пользователи регистрируются через них. Это выглядит так:
id | user_id | provider | uid
-----------------------------
1 | 1 | facebook | xyf
2 | 1 | twitter | pfr
3 | 2 | facebook | sdf
Теперь, следующее, что мне нужно, это сохранить некоторые данные, которые эти поставщики omniauth предоставляют мне. Facebook, например, предоставляет пол пользователя и URL для их профиля в Facebook. С другой стороны, подключение к твиттеру предоставит различную информацию о пользователе.
Это наводит меня на мысль, что у меня должно быть две таблицы: одна для данных в Twitter (TwitterProfile) и одна для данных в Facebook (FacebookProfile).
Так я должен расширить свою модель аутентификации, как эта?
id | user_id | provider | uid | facebook_profile_id | twitter_profile_id
------------------------------------------------------------------------
1 | 1 | facebook | xyf | 1 |
2 | 1 | twitter | pfr | | 2
3 | 2 | facebook | sdf | 2 |
и my models / user.rb будет выглядеть примерно так:
has_many :authentications, :dependent => :destroy
has_one :facebook_profile, :through => :authentications, :source => :facebook_profile
has_one :twitter_profile, :through => :authentications, :source => :twitter_profile
Но может ли моя модель аутентификации принадлежать 3 таблицам?
belongs_to :user
belongs_to :facebook_profile, :class_name => "FacebookProfile"
belongs_to :twitter_profile, :class_name => "TwitterProfile"
Мне кажется, что я на неправильном пути, потому что в моей модели аутентификации есть избыточное пространство, и отношения кажутся слишком сложными.