ActiveRecord :: RecordNotUnique:PG :: UniqueViolation:ERROR:重复键值违反唯一约束

时间:2015-02-22 00:17:23

标签: ruby-on-rails rspec factory-bot

我已将我的用户和我的用户组合在一起转移工厂以节省空间。

FactoryGirl.define do
  factory :user do
    name 'test'
    password 'test'
    phone_number '1-444-555-8888'
  end

  factory :shift do
    user
  end
end

这是我的考试。失败' shift = 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.

如何重复用户记录?我以为我正在为特定用户创建一个班次列表(用户一对多班次关联)。

2 个答案:

答案 0 :(得分:4)

错误是因为create_list(:shift, 20)正在尝试创建20个用户,所有用户都使用相同的电话号码1-444-555-8888,并且存在阻止此操作的唯一性条件。

更改工厂定义,以便为每个用户创建唯一的电话号码,错误应该消失。

这是一种方法:

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)

答案 1 :(得分:0)

如果其他答案不能解决您的问题

就我而言,我有一个迁移文件,可以将一些数据加载到表中。

我跑了

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