PIYO - Tech & Life -

seed_dumpを使ったRSpec高速化にはsequenceのリセットが必要だった

Rails RSpec

先日書いたこれが動かなくなってしまい、よく調べていたらプライマリキー(つまりid)が被って追加できないよってことになってしまったみたいです。

seed_dumpを使ってRailsのテストデータの読み込みを高速化した - PIYO - Tech & Life -
そこそこ複雑なデータを持たないとフィーチャテストを動かせないようなプロジェクトがありまして、きちんとしたデータを作るためにはCSVファイルからデータを取り込んでリレーション作るという必要がありました。

確かに、関連を維持するためにidも含めてテストデータを登録していますので、sequenceの値がおかしくなっていた可能性があります。

そこで、seed.rbの最後に関連するテーブルに対してreset_pk_sequence!を呼ぶことでこの問題に対応しました。reset_pk_sequence!はDBがpostgresのときに使えます。

前回のParentChildの例をそのまま使うとすると、

klasses = [Parent, Child]
klasses.each do |klass|
  ApplicationRecord.connection.reset_pk_sequence!(klass.table_name)
end

とすればOKです。