Three way omniauth authentications relationship. How to set it up?
I've implemented facebook and twitter authentication in an app I'm working on by following the excellent Railscasts videos on the topic.
Thus far I have my user model hooked up with Devise and I have my Authentications model built and recording authentication providers when users sign up via them. It looks like this:
id | user_id | provider | uid
-----------------------------
1 | 1 | facebook | xyf
2 | 1 | twitter | pfr
3 | 2 | faceb开发者_StackOverflowook | sdf
Now, the next thing I need is to store some of the data that these omniauth providers give me. Facebook for example provides the users gender and the url for their facebook profile. A connection to twitter on the other hand will provide different information on a user.
This leads me to believe that I should have two tables, one for twitter data (TwitterProfile) and one for facebook data (FacebookProfile).
So should I extend my authentications model like this?
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 |
and the my models/user.rb would look something like:
has_many :authentications, :dependent => :destroy
has_one :facebook_profile, :through => :authentications, :source => :facebook_profile
has_one :twitter_profile, :through => :authentications, :source => :twitter_profile
But can my authentications model belong to 3 tables?
belongs_to :user
belongs_to :facebook_profile, :class_name => "FacebookProfile"
belongs_to :twitter_profile, :class_name => "TwitterProfile"
It just seems like I'm on the wrong track because I have redundant space in my authentications model ant the relationships seem overly complicated.
You might want to consider a polymorphic association. Say the association is called Profile. Basically, the association has a single profile_id, and a string profile_type column, which indicates what type of profile each authentication has.
There are lots of resources explaining how to set this up including a Railscast video, a section in the Rails Guides and it's in the Rails API too.
精彩评论