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表檢查該用戶是否存在,否則爲該用戶創建一個新的記錄。

+1

突破方法下跌了我以前find_by(...)代替where(...).first:你應該有這樣的事情:

# app/models/user.rb def self.from_omniauth(auth) oauth = Oauth.find_by(auth.slice(:provider, :uid)) if oauth oauth.user else User.create(...) end end 

注意。 'first_or_initialize'不會工作。有一個偉大的railscast會幫助很多:http://railscasts.com/episodes/236-omniauth-part-2。請務必查看該系列的第1部分:http://railscasts.com/episodes/235-omniauth-part-1 – pdobb

+0

@pdobb將檢查出來並返回此處:D –

+1

@HarshaMV爲什麼你有* * oauth_token和oauth_expires_at **字段,當你已經將它們放在oauths表中時?你不必要地重複你的領域。爲什麼不在你的用戶表中有一個oauth_id並且具有像'oauth belongs_to:user'這樣的適當關聯? – Mandeep

回答

1

您正在調用User類方法中的where方法。您必須明確並在正確的模型中調用where方法。因爲你是使用Rails 4