2016-05-10 1 views
0

Я использую Rails 4.2.3. Я хочу использовать Google и Facebook для аутентификации (и создания) пользователей в моей системе. Так что у меня есть это в моем приложение/модели/user.rb файл ...Как предотвратить создание дубликата пользователя в моем приложении Rails?

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 

Проблема выше, если у меня уже есть строки в моей базе данных, как показано ниже

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] 

при входе в систему с Google и вызывая вышеупомянутый метод, вторая строка создается с идентичными данными. Кто-нибудь знает, что я могу сделать, чтобы настроить такие вещи, чтобы, если в моей базе данных уже есть строка в моей базе данных, вызов вышеупомянутого метода не создаст второго, дублированного пользователя.

Спасибо, - Дэйв

Edit: Вот что дб выглядит как после входа в систему с помощью 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

Вы не должны использовать save, first_or_create сохранит его для вас, если он не найдет матч, см http://apidock.com/rails/ActiveRecord/Relation/first_or_create

Так просто удалить это: user.save!

+0

Я сделал то, что вы предлагали, но это все еще не сработало. Я включил данные, которые входят в мою таблицу в мой вопрос. Название, маркер oauth и oauth expires поля отличаются, но я не думал, что это важно, так как UID, провайдер и электронная почта одинаковы. – Dave

+0

Вам нужно указать, в каких столбцах вы хотите, чтобы 'first_or_create' выполнял двойную проверку. Я думаю, что это должно быть только в поле' uid'. Посмотрите на документы: http://apidock.com/rails/ActiveRecord/Relation/first_or_create – Augusto

 Смежные вопросы

  • Нет связанных вопросов^_^