2017-01-04 15 views
0

Ruby 2.1.0でRails 3.2.14を使用しています。私は、電子メールIDが存在するかどうかをチェックすることで、DB内のユーザーを作成する方法を持っています。Rails 3 find_or_create_by_slugは重複レコードを作成することがあります

私はdevitsSAMLをユーザ認証とセッション作成に使用します。

は私がそうするように、次のコードを使用します。

@user = User.find_or_create_by_email(:email=>"[email protected]", firstname: 'XY', lastname: 'Z', code: 'ABC') 

これは、ほとんどの場合に動作しますが、上記のコードは、1を作成しようとして、私は自分のアカウントにエラー通知メールを取得しておく時間の残りの部分

An ActiveRecord::RecordNotUnique occurred in sessions#consume: 

    Mysql2::Error: Duplicate entry '[email protected]' for key 'email' 

このエラーを回避するにはどうすればよいですか?

+0

ARクエリが間違っているようです。 'User.find_or_create_by_email(" [email protected] ")'? – Surya

+0

クエリが正しい場合、レコードが存在しない場合は、上記のように他のフィールドを含むユーザーレコードが作成されます。 – sahil

+0

これを試してください: '@user = User.find_or_create_by_email(...)レスキューUser.find_by_email(...)' –

答えて

1

あなたが最初にSELECT、その後INSERTを実行しますUpsert

find_or_createようなものを使用する必要があります。もう1つのインスタンスでは、INSERTを実行している可能性があります。トランザクションを使用することもできます。

User.transaction do 
    @user = User.find_or_create_by_email(:email=>"[email protected]", firstname: 'XY', lastname: 'Z', code: 'ABC') 
end 
+0

トランザクションだけで十分ですか? – sahil

+0

はい、うまくいくはずです。私はトランザクションがそれを解決するかどうかは完全には分かっていないが、それは可能性があると思う。 –

+0

私はまだ同じ問題に直面しています。 – sahil

関連する問題