种子数据库键值与工厂机器人创建/构建冲突

时间:2018-05-03 17:06:35

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

我们的rails数据库预先为一些静态模型提供了一些数据。例如,我们有一个DocumentType模型,可以通过db/seeds.rb填充/更新。用户无法修改此模型。

然而,这似乎与factory_bot完美搭配;当我尝试:

create(:document_type)

我收到错误声明:

  

的ActiveRecord :: RecordNotUnique:    PG :: UniqueViolation:错误:重复的键值违反了唯一约束" document_types_pkey"    DETAIL:Key(id)=(1)已经存在。

每次运行测试时,都会发生此错误,但尝试保存的密钥(id)会增加。然后,最终,当测试超出种子数据的范围时,测试通过。

我不明白为什么factory_bot实际上设置了id值,并且在保存记录时不让数据库分配它。

document_type factory

FactoryBot.define do
  factory :document_type do
    label 'Alien Spacecraft License'
    description 'It should be obvious, I think'
    created_at { Time.now - 30.days }
    updated_at { Time.now - 30.days }
  end
end

尝试修复

我所尝试的是创建一个夹具文件,它完全模仿seeds.rb文件中的内容 - 当我这样做时,factory_bot会尊重夹具中设置的id值。但它会引起很多重复的努力(我必须让种子与灯具保持同步)。

我已经看过使用灯具来填充数据库,但不幸的是,在我们的例子中,我们在种子数据中使用硬编码的ID来插入/更新...所以灯具看起来不是很好播种选择。

好奇,如果有人有任何想法。谢谢!

1 个答案:

答案 0 :(得分:1)

也许尝试对您的document_type工厂ID进行排序,以便在种子的最后一个ID之后开始递增

FactoryBot.define do
  factory :document_type do
    sequence(:id) {|n| n + 30 } #i.e n + last id known in seed
  end
end