0
我有以下表结构,其中用户有许多Oauth。OmniAuth Facebook的实施
create_table :users do |t|
t.string :name
t.string :email
t.string :age
t.string :gender
t.timestamps
create_table :oauths do |t|
t.string :provider
t.string :provider_uid
t.string :oauth_token
t.datetime :oauth_expires_at
t.text :meta
t.integer :user_id
t.timestamps
因为我将允许使用Facebook,Twitter,Foursquare的用户多次登录。我想把oauths分解成一张新桌子。
用户模型
def self.from_omniauth(auth)
where(auth.slice(:provider, :uid)).first_or_initialize.tap do |user|
user.name = auth.info.name
user.email = auth.info.email
user.oauths.provider = auth.provider
user.oauths.provider_uid = auth.uid
user.oauths.oauth_token = auth.credentials.token
user.oauths.oauth_expires_at = Time.at(auth.credentials.expires_at)
user.save!
user.oauths.save!
end
end
我坚持就如何我可以查询供应商和uid从Oauths表检查该用户是否存在,否则为该用户创建一个新的记录。
突破方法下跌了我以前
find_by(...)
代替where(...).first
:你应该有这样的事情:注意。 'first_or_initialize'不会工作。有一个伟大的railscast会帮助很多:http://railscasts.com/episodes/236-omniauth-part-2。请务必查看该系列的第1部分:http://railscasts.com/episodes/235-omniauth-part-1 – pdobb
@pdobb将检查出来并返回此处:D –
@HarshaMV为什么你有* * oauth_token和oauth_expires_at **字段,当你已经将它们放在oauths表中时?你不必要地重复你的领域。为什么不在你的用户表中有一个oauth_id并且具有像'oauth belongs_to:user'这样的适当关联? – Mandeep