簡易的にテーブルを追加
Railsの作法に則ってやろうとすると、
- モデルを作って、
- migrateの差分を書いて、
- テーブルを作成
というような流れになるんですが、そうすると「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