Railsのmigrate機能で初期データ登録用のマイグレーションファイルを
作りました。
でも、何度かmigrationをしているうちに、
auto_incrementで採番される値はクリアされないので、
どんどん大きくなっていってしまいます。
他のテーブルで外部参照しておりキーの値が変わっては困るのです。
で、最初は以下のようにマイグレーションファイルを作成しました。
イケてないので、メソッド化します。
RAILS_HOME/lib/schema_statements.rb
ファイルを以下のように作りました。
RAILS_HOME/Rakefileに以下を追記
あ、これ mysql でしか調べてないです。
あと、処理を追加するファイルの置き場所とかここで良いのか?
でも、何度かmigrationをしているうちに、
auto_incrementで採番される値はクリアされないので、
どんどん大きくなっていってしまいます。
他のテーブルで外部参照しておりキーの値が変わっては困るのです。
で、最初は以下のようにマイグレーションファイルを作成しました。
class ImportStatusInitialData < ActiveRecord::Migration def self.up down Status.create( :status => 1, :name => "AA" ) Status.create( :status => 2, :name => "BB" ) Status.create( :status => 3, :name => "CC" ) Status.create( :status => 4, :name => "DD" ) Status.create( :status => 5, :name => "EE" ) Status.create( :status => 6, :name => "FF" ) end def self.down Status.delete_all execute "alter table statuses auto_increment=0" end end見て分かるとおり、ネイティブSQLを書いています。
イケてないので、メソッド化します。
RAILS_HOME/lib/schema_statements.rb
ファイルを以下のように作りました。
module ActiveRecord module ConnectionAdapters # :nodoc: module SchemaStatements # ID列 ( autoincrement項目 ) の 順序値を設定する。 def set_autoincrement_number(table_name, number) execute "ALTER TABLE #{quote_table_name(table_name)} AUTO_INCREMENT=#{number}" end end end endで、rakeの時に上記ファイルを読み込むようにする為、
RAILS_HOME/Rakefileに以下を追記
require 'lib/schema_statements'そしてマイグレーションファイルを変更
class ImportStatusInitialData < ActiveRecord::Migration def self.up down Status.create( :status => 1, :name => "AA" ) Status.create( :status => 2, :name => "BB" ) Status.create( :status => 3, :name => "CC" ) Status.create( :status => 4, :name => "DD" ) Status.create( :status => 5, :name => "EE" ) Status.create( :status => 6, :name => "FF" ) end def self.down Status.delete_all set_autoincrement_number :statuses, 0 end endそして、rake db:migrateを実行!!
== 10 ImportStatusInitialData: migrating ====================================== == 10 ImportStatusInitialData: reverting ====================================== -- set_autoincrement_number(:statuses, 0) -> 0.0139s == 10 ImportStatusInitialData: reverted (0.0176s) ============================= == 10 ImportStatusInitialData: migrated (0.0388s) =============================バッチリです。
あ、これ mysql でしか調べてないです。
あと、処理を追加するファイルの置き場所とかここで良いのか?