簡易的にテーブルを追加

Railsの作法に則ってやろうとすると、

  1. モデルを作って、
  2. migrateの差分を書いて、
  3. テーブルを作成

というような流れになるんですが、そうすると「db:migrate」フォルダに「001_*、002_*、・・・」とファイルがどんどんできてきて、テーブルが固まってからならいざ知らず、試行錯誤の段階を逐一記録していくのは嫌だなぁと。

モデルを作る

「shipping」というテーブルを追加で作ってみます。

C:\www\2.5-55.jp> ruby script/generate scaffold shipping id:primary_key shop:references kenCode:integer price1:decimal price2:decimal price3:decimal cond1:decimal cond2:decimal cond3:decimal
      exists  app/models/
      exists  app/controllers/
      exists  app/helpers/
      create  app/views/shippings
      exists  app/views/layouts/
      exists  test/functional/
      exists  test/unit/
      create  app/views/shippings/index.html.erb
      create  app/views/shippings/show.html.erb
      create  app/views/shippings/new.html.erb
      create  app/views/shippings/edit.html.erb
      create  app/views/layouts/shippings.html.erb
   identical  public/stylesheets/scaffold.css
  dependency  model
      exists    app/models/
      exists    test/unit/
      exists    test/fixtures/
      create    app/models/shipping.rb
      create    test/unit/shipping_test.rb
      create    test/fixtures/shippings.yml
      exists    db/migrate
      create    db/migrate/002_create_shippings.rb
      create  app/controllers/shippings_controller.rb
      create  test/functional/shippings_controller_test.rb
      create  app/helpers/shippings_helper.rb
       route  map.resources :shippings

いままでのテーブルを削除

C:\www\2.5-55.jp> rake db:migrate VERSION=0
 (in C:/www/2.5-55.jp)
 == 1 CreateItems: reverting ===================================================
 -- drop_table(:items)
    -> 0.1300s
 -- drop_table(:shops)
    -> 0.0500s
 == 1 CreateItems: reverted (0.1800s) ==========================================

テーブルが削除されたかどうかの確認

C:\www\2.5-55.jp> mysql -u root -ppassword -e'select * from schema_info' 2555_development

ちなみにこれ(↑)はエラーになります。どこが悪いか20分ほど悩みまくりました。
正解はこちら(↓)。シングルコートってWindowsでは使えなかったんでしたっけ。

C:\www\2.5-55.jp> mysql -u root -ppassword -e"select * from schema_info" 2555_development
                    • +
version
                    • +
0
                    • +

Railsで複合キーをインデックスにする

create_table :shippings do |t|
   t.primary_key :id
   t.references  :shop
   t.integer     :ken
end
add_index :shippings, [:shop_id, :ken]

「shop」ではなくて「shop_id」にしないと「Mysql::Error: Key column 'shop' doesn't exist in table」ということで、MySQLからそんなカラムはねぇ!と怒られます。

まとめ

C:\www\2.5-55.jp> rake db:migrate VERSION=0 ← テーブルDROPして
C:\www\2.5-55.jp> rake db:migrate      ← テーブルCREATEして
C:\www\2.5-55.jp> rake db:fixtures:load   ← テストデータ流し込み

テストデータは、/test/fixturesフォルダに作ります。*.ymlでサンプルが作成されますが、行数が多くて面倒な場合は、そのファイルを消して同名で *.csvファイルを作成すれば、カンマ区切りでデータが作れます。一番最初にカラム名を記述すること。(あと「shop」ではなくて「shop_id」)

id,shop_id,kenCode,price1,price2,price3,cond1,cond2
1,1,1,590,0,0,7350,0
2,1,2,590,0,0,7350,0
3,1,3,590,0,0,7350,0