既存のDBとRailsを組み合わせて使う(1)〜開発用 データベースを作る

すでにDBがあって,データもそこそこ入っている状況で,そのDBを使うRailsアプリを作りたい。テーブル構成はシンプルで,メインのテーブルが数個のテーブルを(1:1で)外部参照しているだけ。ただ,このメインテーブルにはRails必須のidカラムが無い。idとして使っているカラムはあるが整数でもない。うーん。とりあえず稼働中といってもまだ公開しているわけじゃないので,一度ダンプして,カラムにシリアル型のidを追加してリストアした。

せっかく既にDBがあるんだから,development用に同じストラクチャのテーブルを手作業で作るのは面倒くさい。

  1. とりあえずDBだけは作った(artonさん本の db_setup.rake が便利)
  2. database.yml を編集して,production は稼働中DBに合わせた。

rake environment RAILS_ENV=production db:schema_dump

これでスキーマがダンプされる。これを migrate のスクリプトにそのまま使おう。

ruby script/generale model Member

とモデルを作ると(ただし罠あり。次項を参照),db/migrate の下に 001_create_members.rb というファイルができるので,その中にさっき作ったスキーマのファイルからコピペ。各モデルごとにこれを繰り返す。マイグレーションする前にもう1つ問題が。
メインのデータベースには id カラムを追加したけど,他のテーブルには無い。でも「id」って名前じゃないけど整数のプライマリーキーは付いているので,それをそのまま使いたい。こんな感じでマイグレーションファイルに追加。

   options = {
      :primary_key => "job_id"
   }
   create_table :job_master, options do |t|
      t.column "name", :string, :null => false
   end

最後に

rake migrate

すれば同じテーブル構成ができる。もっと簡単な方法があったら教えてほしい。なにか便利な rake タスクがあるのだろうか(rake -T でタスク一覧がでます)。
ここまでくると,production(つまり稼働中の)データベースからdevelopmentにデータを持ってくるのも自動化したい。けどこれも簡単な方法が分からなかったので,DB固有のダンプ&リストアを使った。lib/tasks配下にrakeのタスクを書けば何かいいことがあるだろうか。これも便利なタスクが既にあるのかな。
カラム名なんか Rails 流に直したくなるけど,面倒になりそうのでぐっと我慢。