植入的数据库键值与工厂机器人冲突 create/build
Seeded database key values conflicting with factory bot create/build
我们的 rails 数据库预先植入了一些静态模型的数据。例如,我们有一个 DocumentType
模型,通过 db/seeds.rb
得到 populated/updated。用户无法修改此模型。
然而,这似乎与 factory_bot 配合得不太好;当我尝试:
create(:document_type)
我收到一条错误消息:
ActiveRecord::RecordNotUnique:
PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "document_types_pkey"
DETAIL: Key (id)=(1) already exists.
每次我运行测试时,都会发生此错误,但尝试保存的密钥(id)会增加。然后,最终,当测试超出种子数据的范围时,测试就会通过。
我不明白的是为什么factory_bot实际上是在设置id
值而不是让数据库在保存记录时分配它。
document_type工厂
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
尝试修复
我尝试的是创建一个 fixture 文件,它完全模仿 seeds.rb 文件中的内容——当我这样做时,factory_bot 尊重 id
中设置的值夹具。但这会导致很多重复工作(我必须让种子与固定装置同步)。
我已经研究过使用固定装置来填充数据库,但不幸的是,在我们的例子中,我们在种子数据中使用硬编码 ID 来 insert/update ...所以固定装置看起来不像一个很好的播种选项。
如果有人有任何想法,我很好奇。谢谢!
也许可以尝试对您的 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
我们的 rails 数据库预先植入了一些静态模型的数据。例如,我们有一个 DocumentType
模型,通过 db/seeds.rb
得到 populated/updated。用户无法修改此模型。
然而,这似乎与 factory_bot 配合得不太好;当我尝试:
create(:document_type)
我收到一条错误消息:
ActiveRecord::RecordNotUnique: PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "document_types_pkey" DETAIL: Key (id)=(1) already exists.
每次我运行测试时,都会发生此错误,但尝试保存的密钥(id)会增加。然后,最终,当测试超出种子数据的范围时,测试就会通过。
我不明白的是为什么factory_bot实际上是在设置id
值而不是让数据库在保存记录时分配它。
document_type工厂
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
尝试修复
我尝试的是创建一个 fixture 文件,它完全模仿 seeds.rb 文件中的内容——当我这样做时,factory_bot 尊重 id
中设置的值夹具。但这会导致很多重复工作(我必须让种子与固定装置同步)。
我已经研究过使用固定装置来填充数据库,但不幸的是,在我们的例子中,我们在种子数据中使用硬编码 ID 来 insert/update ...所以固定装置看起来不像一个很好的播种选项。
如果有人有任何想法,我很好奇。谢谢!
也许可以尝试对您的 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