【问题标题】:ActiveRecord::RecordNotUnique: PG::UniqueViolation: ERROR: duplicate key value violates unique constraintActiveRecord::RecordNotUnique: PG::UniqueViolation: 错误: 重复键值违反唯一约束
【发布时间】:2015-02-22 00:17:23
【问题描述】:

我已将我的用户和班次工厂结合起来以节省空间。

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.

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

【问题讨论】:

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


    【解决方案1】:

    错误是因为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)
    

    【讨论】:

      【解决方案2】:

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

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

      我跑了

      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
      

      【讨论】:

        猜你喜欢
        • 2021-02-11
        • 1970-01-01
        • 1970-01-01
        • 2018-05-14
        • 2015-03-24
        • 2020-02-15
        • 1970-01-01
        • 2016-07-27
        • 2011-10-17
        相关资源
        最近更新 更多