在rspec期间,重复的键值违反了唯一约束

时间:2016-08-18 16:29:00

标签: ruby-on-rails rspec

如何避免Duplicate key value violates unique constraint

我假设id:1已在使用中,但我需要强烈设置id

因为我在category模型中有方法

def iconic
  case self.id
      when 1
       smth
     ....
  end  
 end

我的工厂

FactoryGirl.define do
  factory :category do
    sequence(:title) { |n| Faker::Hipster.word+"#{n}" }
    position 1
    text Faker::Lorem.sentence
    image File.open(Rails.root.join('test', 'assets', 'images', 'banners', (1..6).to_a.sample.to_s+'.png'))

  end
end

Failure/Error: c1 = create(:category, id: 1)

 ActiveRecord::RecordNotUnique:
   PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "categories_pkey"
   DETAIL:  Key (id)=(1) already exists.

1 个答案:

答案 0 :(得分:1)

是的问题是您尝试创建具有相同id属性值的多个记录,这是不允许的。它应该永远是唯一的。

实际问题我认为你的模型代码依赖于对象的id

def iconic
  case self.id
    when 1
     smth
     ....
  end  
end

基于id属性编写逻辑不是一个好习惯,因为每次填充数据库时都无法确保将相同的ID分配给同一个对象。相反,您应该使用其他一些独特的属性,例如slugemailusername,适合您的模型。所以,你应该修改你的模型逻辑:

def iconic
  case self.slug_or_any_other_unique_field
    when 'expected_value_of_above_field'
      smth
      ....
  end  
end