環境はruby-1.9.3-p0, rails3.2.2, postgresです。
難易度★★★☆☆
railsアプリで初期データを投入する場合は、seeds.rbファイルを利用します。
しかし、初期データとしてpostgresのテーブルにidを指定したデータを投入すると、postgresのsequenceがセットされません。
そのため、管理画面等を作成してマスタに追加登録しようとすると、insertのときに失敗します。
そのため、sequenceの更新処理も同時におこなう必要があります。
seeds.rb
obj1 = TestMaster.new(:id => 1, name => "test") obj1.save obj2 = TestMaster.new(:id => 2, name => "test") obj2.save // continue until 100(100まで継続)
上記のseeds.rbでは、TestMasterテーブルにid1から100までのデータをinsertしています。
しかし、sequenceは変更されていないので、このまま新規登録処理をおこなうとsequenceがidに1を割り当て、重複キーエラーが発生してしまいます。
なので、seeds.rbにシーケンス更新する処理を追加する必要があります。
set sequence_id
obj1 = TestMaster.new(:id => 1, name => "test") obj1.save obj2 = TestMaster.new(:id => 2, name => "test") obj2.save // continue until 100(100まで継続) // set seq connection = ActiveRecord::Base.connection(); connection.execute("select setval('test_master_id_seq',(select max(id) from test_master))")
上記のように直接SQLを発行してシーケンスを設定します。
これでidとsequenceの同期が取れたことになります。
以上です。
参考サイト
0 件のコメント:
コメントを投稿