Rails 3 find_or_create_by_slug有时会创建重复记录

时间:2017-01-04 09:22:40

标签: ruby ruby-on-rails-3 devise

我在Ruby 2.1.0中使用Rails 3.2.14。我有一个方法,通过检查电子邮件ID是否存在来负责在DB中创建用户。

我使用设计 SAML 进行用户身份验证和会话创建。

我使用以下代码执行此操作:

@user = User.find_or_create_by_email(:email=>"xyz@gmail.com", firstname: 'XY', lastname: 'Z', code: 'ABC')

这适用于大多数情况,但其余时间我一直在我的帐户中收到错误通知电子邮件,因为上面的代码尝试使用相同的电子邮件再创建一个用户:

An ActiveRecord::RecordNotUnique occurred in sessions#consume:

  Mysql2::Error: Duplicate entry 'xyz@gmail.com' for key 'email'

如何避免此错误?

1 个答案:

答案 0 :(得分:1)

您需要使用Upsert

之类的内容

SELECT将首先运行INSERT,然后INSERT。另一个实例可能在其间运行User.transaction do @user = User.find_or_create_by_email(:email=>"xyz@gmail.com", firstname: 'XY', lastname: 'Z', code: 'ABC') end 。您也可以使用交易:

PIXI.utils._saidHello = true;