1. マイグレーション(4)
2012/09/24 シナジーマーケティング(株) 鈴木 圭
Model 1章 マイグレーション
- 1.1. マイグレーションとは
- 1.2. マイグレーションの作成と実行
- 1.3. マイグレーションファイルの名前
- 1.4. データ型
- 1.5. マイグレーション API
- 1.6. マイグレーションに関する Rake タスク
- 1.7. リバーシブル・マイグレーション
- 1.8. 特殊なカラム名
- 1.9. 初期データの登録
- 1.10. データ修正
1.8. 特殊なカラム名
Ruby on Rails では特殊な用途で使用されるカラム名がいくつかあります。
前述した created_at や updated_at もその一つです。
特殊な用途で使用されるカラムと知らずに同じ名前のカラムを作成してしまうと、意図しない動作となる可能性があるので注意が必要です。
他にも Ruby や Rails が定義するメソッド名や、使用するデータベースの予約語と同じ名前は避けたほうが良いでしょう。
以下に特殊なカラム名として一般的なものを挙げます。
カラム名 | 説明 |
---|---|
created_at, created_on, updated_at, updated_on | レコードの登録日時、更新日時を保持するカラムです。この名前のカラムがある場合、Ruby on Rails によって自動的に値が設定されます。 |
lock_version | 楽観的排他制御のために使用されるカラムです。 |
type | 単一テーブル継承(STI: Single Table Inheritance)という機能で利用されるカラムです。 |
<テーブル名>_count | カウンターキャッシュ(Counter Cache)という機能で利用されるカラムです。 |
事実上、特別扱いされるカラム(カラム名として避けるべき名前)の全てを把握することは困難であるのが実情です。
もし特定のカラムに関する動作だけがおかしいという場合は、特殊なカラム名を使っていないか疑うことも必要です。
1.9. 初期データの登録
初期データとは、アプリケーションが動作するために必要なデータのことです。
初期データの候補としては、都道府県データやシステムの管理ユーザの情報などがあるでしょう。
Ruby on Rails では db/seeds.rb に初期データを登録する処理を Ruby コードで記述します。
例として、都道府県データの初期データを登録することを考えます。
都道府県を表すクラスが Prefecture であるとすると、以下のように記述します。
# 都道府県 (code:都道府県コード, name:都道府県名) を登録する. Prefecture.create!(:code => '01', :name => '北海道') Prefecture.create!(:code => '02', :name => '青森県') Prefecture.create!(:code => '03', :name => '岩手県') # (中略) Prefecture.create!(:code => '45', :name => '宮崎県') Prefecture.create!(:code => '46', :name => '鹿児島県') Prefecture.create!(:code => '47', :name => '沖縄県')
注意として、Ruby on Rails が定めているのは「初期データの登録処理は db/seeds.rb に記述する」ということだけです。
db/seeds.rb にはマイグレーションのように決まりきった書き方があるわけでも、create_table のようなメソッドが提供されているわけでもありません。
初期データが少ない場合は「Prefecture.create!(…)」のような文を繰り返し記述するだけで十分です。
しかし、データ量が多い場合や複数のテーブルにデータを登録する場合は一工夫した方が良いでしょう。
例えばテーブルごとにファイルを分割する(db/seeds.rb では分割したファイルを読み込む)ことや、データを CSV ファイルから読み込むようにするアプローチが考えられます。
初期データを登録するには以下のコマンドを実行します。
rake db:seed
上記コマンドを実行すると、単純に db/seeds.rb が実行されます。
「rake db:seed」を何度も実行すると、その回数だけ db/seeds.rb が実行される点にはご注意ください。
場合によっては初期データを再登録できると便利なこともあります。
db/seeds.rb を以下のように作成すれば、「rake db:seed」を何度実行しても同じ結果が得られるようになります。
- 最初に全データを削除する。
- シーケンスの値をリセットする。
- 初期データを登録する。
1.10. データ修正
マイグレーションとは少し異なるトピックですが、データ修正について補足します。
データ修正とは、アプリケーションの不具合などで発生したデータの不整合を解消する作業などのことです。
そのような作業が発生しないに越したことはありませんが、システムを運用しているとそのような状況に置かれることも事実です。
結論から言うと、Ruby on Rails にはデータ修正のための仕組みはありません。
データ修正を行う方法としては、以下のアプローチが考えられます。
- SQL でデータ修正を行う。
- データ修正を行う Ruby スクリプトを作成し、「rails runner <ファイル名>」で実行する。
- マイグレーションでデータ修正を行う。(非推奨)
上記のうちマイグレーションでデータ修正を行うアプローチはお薦めしません。
マイグレーションはデータ修正ではなくスキーマ変更を行うためのものですし、
データ修正はデータベースの内容に応じて行う内容が異なる場合があるからです。
データ修正が必要な状況というのは、臨機応変な対応が必要な状況であるので、
無理に Ruby on Rails のマイグレーションの枠で対応しようとするのではなく、
その状況に適したアプローチで対応することが重要です。