ActiveRecord::RecordNotUnique: PG::UniqueViolation: 错误: 重复键值违反唯一约束 [英] ActiveRecord::RecordNotUnique: PG::UniqueViolation: ERROR: duplicate key value violates unique constraint

查看:69
本文介绍了ActiveRecord::RecordNotUnique: PG::UniqueViolation: 错误: 重复键值违反唯一约束的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已将我的用户和转移工厂以节省空间.

I've combined my user & shift factories to save 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)' 失败

This is my test. Fails on '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.

怎么会有重复的用户记录?我以为我正在为特定用户(用户一对多轮班关联)创建轮班列表.

How is there duplicate user records? I thought I was creating a list of shifts for a specific user (user one to many shifts association).

推荐答案

错误是因为 create_list(:shift, 20) 正在尝试创建 20 个用户,所有用户都具有相同的电话号码 1-444-555-8888,并且有一个唯一性条件可以防止这种情况.

The error is because create_list(:shift, 20) is trying to create 20 users, all with the same phone number 1-444-555-8888, and there is a uniqueness condition that prevents this.

更改工厂定义,使其为每个用户创建唯一的电话号码,错误应该会消失.

Change the factory definition such that it creates unique phone numbers for each users, and the error should go away.

这是一种方法:

phone_number { rand(10**9..10**10)}

参考:使用工厂序列生成唯一电话号码

由于您的要求是为一位用户创建 20 个班次,请尝试以下操作:

Since your requirement is to create 20 shifts for one user, try the following:

@user = create(:user)
create_list(:shift, 20, user: @user)

这篇关于ActiveRecord::RecordNotUnique: PG::UniqueViolation: 错误: 重复键值违反唯一约束的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆