2016-05-10 8 views
0

私はRails 4.2.3を使用しています。私は、GoogleとFacebookを使って自分のシステムのユーザーを認証(および作成)したいと考えています。だから私は、私はすでに伐採時にRailsアプリケーションで重複したユーザーが作成されないようにするにはどうすればよいですか?

id | provider |   uid   |  name  | oauth_token | oauth_expires_at |   created_at   |   updated_at   |   email   
----+---------------+-----------------------+---------------+-------------+------------------+----------------------------+----------------------------+------------------------- 
    5 | google-oauth2 | 777711643329020555465 | Dave A  |    |     | 2016-05-10 20:08:59.182744 | 2016-05-10 20:08:59.182744 | [email protected] 

以下のように、私のデータベース内の行を持っている場合は、上記の問題点がある

def self.from_omniauth(auth) 
    where(provider: auth.provider, uid: auth.uid).first_or_create do |user| 
     user.provider = auth.provider 
     user.uid = auth.uid 
     user.email = auth.info.email 
     user.name = auth.info.name 
     user.oauth_token = auth.credentials.token 
     user.oauth_expires_at = Time.at(auth.credentials.expires_at) 
     user.save! 
    end 
    end 

...私のアプリ/モデル/ user.rbファイルでこれを持っています上記の方法を呼び出すと、同じデータで2番目の行が作成されます。誰もが私のデータベースの行が既にある場合、上記のメソッドを呼び出すと、2番目の、重複したユーザーを作成しないようなものを微調整するために何ができるか知っていますか?

おかげで、 - Daveは

編集:ここではでは、GoogleのOAuth経由でログインした後

id | provider |   uid   |  name  |         oauth_token         | oauth_expires_at |   created_at   |   updated_at   |   email   
----+---------------+-----------------------+---------------+-----------------------------------------------------------------------------+---------------------+----------------------------+----------------------------+------------------------- 
    5 | google-oauth2 | 777711643329020555465 | Dave A  |                    |      | 2016-05-10 20:08:59.182744 | 2016-05-10 20:08:59.182744 | [email protected] 
    7 | google_oauth2 | 777711643329020555465 | D. A.   | ya29.CjLeAiJ--FTY1UhMwXdb7yk74hhdCH4O6sz3ewbG8wBNdmRHAJWZ0esoS0yZLp5fXmS60Q | 2016-05-10 21:49:55 | 2016-05-10 20:49:57.277341 | 2016-05-10 20:49:57.277341 | [email protected] 

答えて

1

あなたはあなたの場合のためにそれを保存しますsavefirst_or_createを使用してはならないようにDBが見えるものです一致するものが見つかりません。http://apidock.com/rails/ActiveRecord/Relation/first_or_create

user.save!

01を参照してください。
+0

私はあなたが示唆したようにしましたが、それでも動作しませんでした。私は私の質問に私のテーブルに含まれるデータを含めました。名前、oauthトークン、oauth expiresフィールドは異なりますが、UID、プロバイダ、電子メールが同じであるため、重要ではないと私は考えていました。 – Dave

+0

'first_or_create'に重複チェックを実行させたいカラムを指定する必要があります。これは' uid'フィールドだけにあると思います。ドキュメントを見てください:http://apidock.com/rails/ActiveRecord/Relation/first_or_create – Augusto

関連する問題