Я использую 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]
Я сделал то, что вы предлагали, но это все еще не сработало. Я включил данные, которые входят в мою таблицу в мой вопрос. Название, маркер oauth и oauth expires поля отличаются, но я не думал, что это важно, так как UID, провайдер и электронная почта одинаковы. – Dave
Вам нужно указать, в каких столбцах вы хотите, чтобы 'first_or_create' выполнял двойную проверку. Я думаю, что это должно быть только в поле' uid'. Посмотрите на документы: http://apidock.com/rails/ActiveRecord/Relation/first_or_create – Augusto