ActiveRecord::RecordNotUnique: PG::UniqueViolation: ERROR: duplicate key value violates unique constraint
ActiveRecord::RecordNotUnique: PG::UniqueViolation: ERROR: duplicate key value violates unique constraint
我已经合并了我的用户和转移工厂以节省 space。
FactoryGirl.define do
factory :user do
name 'test'
password 'test'
phone_number '1-444-555-8888'
end
factory :shift do
user
end
end
这是我的测试。在 'shifts = create_list(:shift, 20)'
上失败
require 'spec_helper'
describe MyFirebase do
let(:dummy_class) { Class.new { include MyFirebase } }
describe ".firebase_update_duration" do
it "should update total duration value in firebase", focus: true do
shifts = create_list(:shift, 20)
instance = dummy_class.new
duration = instance.firebase_update_duration
p "/" * 100
p duration
p "/" * 100
duration.should eq(Shift.shift_duration_total)
end
end
end
这是错误:
Failure/Error: shifts = create_list(:shift, 20)
ActiveRecord::RecordNotUnique:
PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "index_users_on_phone_number"
DETAIL: Key (phone_number)=(1-444-555-8888) already exists.
怎么会有重复的用户记录?我以为我正在为特定用户创建一个班次列表(用户一对多班次关联)。
错误是因为 create_list(:shift, 20)
试图创建 20 个用户,所有用户都具有相同的 phone 号码 1-444-555-8888
,并且有一个唯一性条件阻止了这种情况。
更改出厂定义,使其为每个用户创建唯一的 phone 号码,错误应该会消失。
这是一种方法:
phone_number { rand(10**9..10**10)}
参考:Use a factory's sequence to generate unique phone numbers
由于您的要求是为一个用户创建 20 个班次,请尝试以下操作:
@user = create(:user)
create_list(:shift, 20, user: @user)
如果其他答案不能解决您的问题
在我的例子中,我有一个迁移文件,它将一些数据加载到 table。
我运行
rake db:migrate:reset RAILS_ENV=test
重新生成干净的 schema.rb
文件。发生的事情是,由 运行 所有迁移文件生成了数据库。这引起了碰撞,因为在我喜欢的测试文件中
let!(:external_call_center_number) { create(:setting, :external_call_center_number).value }
然后开始显示
ActiveRecord::RecordNotUnique:
PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "index_settings_on_code"
DETAIL: Key (code)=(EXTERNAL_CALL_CENTER_NUMBER) already exists.
解决方案
我从 schema.rb
而不是 运行 整个迁移中清理了数据库并生成了模式。
bin/rake db:reset RAILS_ENV=test
我已经合并了我的用户和转移工厂以节省 space。
FactoryGirl.define do
factory :user do
name 'test'
password 'test'
phone_number '1-444-555-8888'
end
factory :shift do
user
end
end
这是我的测试。在 'shifts = create_list(:shift, 20)'
上失败require 'spec_helper'
describe MyFirebase do
let(:dummy_class) { Class.new { include MyFirebase } }
describe ".firebase_update_duration" do
it "should update total duration value in firebase", focus: true do
shifts = create_list(:shift, 20)
instance = dummy_class.new
duration = instance.firebase_update_duration
p "/" * 100
p duration
p "/" * 100
duration.should eq(Shift.shift_duration_total)
end
end
end
这是错误:
Failure/Error: shifts = create_list(:shift, 20)
ActiveRecord::RecordNotUnique:
PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "index_users_on_phone_number"
DETAIL: Key (phone_number)=(1-444-555-8888) already exists.
怎么会有重复的用户记录?我以为我正在为特定用户创建一个班次列表(用户一对多班次关联)。
错误是因为 create_list(:shift, 20)
试图创建 20 个用户,所有用户都具有相同的 phone 号码 1-444-555-8888
,并且有一个唯一性条件阻止了这种情况。
更改出厂定义,使其为每个用户创建唯一的 phone 号码,错误应该会消失。
这是一种方法:
phone_number { rand(10**9..10**10)}
参考:Use a factory's sequence to generate unique phone numbers
由于您的要求是为一个用户创建 20 个班次,请尝试以下操作:
@user = create(:user)
create_list(:shift, 20, user: @user)
如果其他答案不能解决您的问题
在我的例子中,我有一个迁移文件,它将一些数据加载到 table。
我运行
rake db:migrate:reset RAILS_ENV=test
重新生成干净的 schema.rb
文件。发生的事情是,由 运行 所有迁移文件生成了数据库。这引起了碰撞,因为在我喜欢的测试文件中
let!(:external_call_center_number) { create(:setting, :external_call_center_number).value }
然后开始显示
ActiveRecord::RecordNotUnique:
PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "index_settings_on_code"
DETAIL: Key (code)=(EXTERNAL_CALL_CENTER_NUMBER) already exists.
解决方案
我从 schema.rb
而不是 运行 整个迁移中清理了数据库并生成了模式。
bin/rake db:reset RAILS_ENV=test