Rails 3 find_or_create_by_slug 有时会创建重复记录
Rails 3 find_or_create_by_slug sometimes creates duplicate records
我正在使用 Rails 3.2.14 和 Ruby 2.1.0。我有一种方法可以通过检查电子邮件 ID 是否存在来在数据库中创建用户。
我使用 devise 和 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'
如何避免这个错误?
您需要使用 Upsert
find_or_create
将首先 运行 SELECT
然后 INSERT
。另一个实例可能在 运行 和 INSERT
之间。您也可以使用交易:
User.transaction do
@user = User.find_or_create_by_email(:email=>"xyz@gmail.com", firstname: 'XY', lastname: 'Z', code: 'ABC')
end
我正在使用 Rails 3.2.14 和 Ruby 2.1.0。我有一种方法可以通过检查电子邮件 ID 是否存在来在数据库中创建用户。
我使用 devise 和 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'
如何避免这个错误?
您需要使用 Upsert
find_or_create
将首先 运行 SELECT
然后 INSERT
。另一个实例可能在 运行 和 INSERT
之间。您也可以使用交易:
User.transaction do
@user = User.find_or_create_by_email(:email=>"xyz@gmail.com", firstname: 'XY', lastname: 'Z', code: 'ABC')
end