2012年7月31日火曜日

Ruby on Rails3で初期データ投入の注意点

環境は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 件のコメント:

コメントを投稿

Related Posts Plugin for WordPress, Blogger...