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 でしか調べてないです。
あと、処理を追加するファイルの置き場所とかここで良いのか?