Отношения трехсторонней аутентификации omniauth. Как это настроить?

Я реализовал аутентификацию 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 предоставит другую информацию о пользователе.

Это наводит меня на мысль, что у меня должно быть две таблицы: одна для данных 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            | 

и мои модели/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"

Просто кажется, что я на неправильном пути, потому что у меня есть избыточное пространство в моей модели аутентификации, и отношения кажутся слишком сложными.


person David Tuite    schedule 07.03.2011    source источник


Ответы (1)


Возможно, вы захотите рассмотреть полиморфную ассоциацию. Скажем, ассоциация называется Профиль. По сути, ассоциация имеет один profile_id и строковый столбец profile_type, который указывает, какой тип профиля имеет каждая аутентификация.

Существует множество ресурсов, объясняющих, как это настроить, включая видео Railscast, раздел в Руководства по Rails и в Rails API.

person drewrobb    schedule 07.03.2011