0

通过关注关于该主题的优秀Railscasts 视频,我已经在我正在开发的应用程序中实现了 facebook 和 twitter 身份验证。

到目前为止,我已经将我的用户模型与Devise连接起来,并且当用户通过它们注册时,我已经构建了我的身份验证模型并记录了身份验证提供程序。它看起来像这样:

id | user_id | provider | uid
-----------------------------
1  |    1    | facebook | xyf
2  |    1    | twitter  | pfr
3  |    2    | facebook | sdf

现在,我需要做的下一件事是存储这些omniauth 提供商给我的一些数据。例如,Facebook 为他们的 Facebook 个人资料提供用户性别和 url。另一方面,与 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            | 

我的 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"

似乎我走错了路,因为我的身份验证模型中有多余的空间,而关系似乎过于复杂。

4

1 回答 1

1

您可能需要考虑多态关联。假设该关联称为 Profile。基本上,该关联有一个 profile_id 和一个字符串 profile_type 列,它指示每个身份验证具有什么类型的配置文件。

有很多资源解释了如何设置它,包括Railscast 视频, Rails 指南中的一个部分,它也在Rails API中。

于 2011-03-07T21:32:17.150 回答