どういうことかと言うと、

rails(1) でつくる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[udzura@udzra.jp rails]$ rails -v
Rails 2.3.5
[udzura@udzra.jp rails]$ rails -d mysql migtest
      create
      create  app/controllers
      create  app/helpers
      create  app/models
      create  app/views/layouts
      create  config/environments
...
      create  log/server.log
      create  log/production.log
      create  log/development.log
      create  log/test.log

マイグレーションを作る。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[udzura@udzra.jp rails]$ cd migtest/
[udzura@udzra.jp migtest]$ script/generate model User name:string
      exists  app/models/
      exists  test/unit/
      exists  test/fixtures/
      create  app/models/user.rb
      create  test/unit/user_test.rb
      create  test/fixtures/users.yml
      create  db/migrate
      create  db/migrate/20100122041512_create_users.rb
[udzura@udzra.jp migtest]$ script/generate model Blog user_id:integer entry:text
      exists  app/models/
      exists  test/unit/
      exists  test/fixtures/
      create  app/models/blog.rb
      create  test/unit/blog_test.rb
      create  test/fixtures/blogs.yml
      exists  db/migrate
      create  db/migrate/20100122041555_create_blogs.rb

2099年とかすっごい未来にリネームする。

1
2
3
4
5
6
[udzura@udzra.jp migtest]$ ls -l db/migrate/
合計 8
-rw-rw-r--  1 udzura udzura 193  122 13:15 20100122041512_create_users.rb
-rw-rw-r--  1 udzura udzura 217  122 13:15 20100122041555_create_blogs.rb
[udzura@udzra.jp migtest]$ mv db/migrate/20100122041555_create_blogs.rb \
  db/migrate/20990122041555_create_blogs.rb

マイグレートする。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[udzura@udzra.jp migtest]$ rake db:create
(in /var/web-devel/rails/migtest)
[udzura@udzra.jp migtest]$ rake db:migrate
(in /var/web-devel/rails/migtest)
==  CreateUsers: migrating ====================================================
-- create_table(:users)
   -> 0.0038s
==  CreateUsers: migrated (0.0041s) ===========================================
 
==  CreateBlogs: migrating ====================================================
-- create_table(:blogs)
   -> 0.0032s
==  CreateBlogs: migrated (0.0035s) ===========================================
 
[udzura@udzra.jp migtest]$ mysql -uroot -pxxxx -e "SHOW TABLES" migtest_development
+-------------------------------+
| Tables_in_migtest_development |
+-------------------------------+
| blogs                         |
| schema_migrations             |
| users                         |
+-------------------------------+
[udzura@udzra.jp migtest]$ rake db:version
(in /var/web-devel/rails/migtest)
Current version: 20990122041555

マイグレーションを加える。当然、さっき作った二つのマイグレーションの間に入ります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[udzura@udzra.jp migtest]$ script/generate model UserFriend user_id:integer friend_user_id:integer
      exists  app/models/
      exists  test/unit/
      exists  test/fixtures/
      create  app/models/user_friend.rb
      create  test/unit/user_friend_test.rb
      create  test/fixtures/user_friends.yml
      exists  db/migrate
      create  db/migrate/20100122041954_create_user_friends.rb
[udzura@udzra.jp migtest]$ ls -l db/migrate/
合計 12
-rw-rw-r--  1 udzura udzura 193  122 13:15 20100122041512_create_users.rb
-rw-rw-r--  1 udzura udzura 249  122 13:19 20100122041954_create_user_friends.rb
-rw-rw-r--  1 udzura udzura 217  122 13:15 20990122041555_create_blogs.rb

こういう場合でもさかのぼってマイグレーションを実行してくれます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[udzura@udzra.jp migtest]$ rake db:migrate
(in /var/web-devel/rails/migtest)
==  CreateUserFriends: migrating ==============================================
-- create_table(:user_friends)
   -> 0.0067s
==  CreateUserFriends: migrated (0.0071s) =====================================
 
[udzura@udzra.jp migtest]$ mysql -uroot -pxxxx -e "SHOW TABLES" migtest_development
+-------------------------------+
| Tables_in_migtest_development |
+-------------------------------+
| blogs                         |
| schema_migrations             |
| user_friends                  |
| users                         |
+-------------------------------+

何が嬉しいの?

例えば、実表のマイグレーションを通常の作成時の日次で、ビュー表を作成するマイグレーションを「2099年」の日次で、という風にしておくと、「必ずすべての実表が作られてからビュー表が定義される」ことが保障され、なおかつ、ビュー表の定義を変更した際、作り直しが rake(1) で容易にできます。

ポイントは rake db:migrate:down VERSION=2099XXXXXXXXXX

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[udzura@udzra.jp migtest]$ rake db:migrate:down VERSION=20990122041555
(in /var/web-devel/rails/migtest)
==  CreateViewBlogs: reverting ====================================================
-- drop_table(:view_blogs)
   -> 0.0277s
==  CreateViewBlogs: reverted (0.0280s) ===========================================
 
[udzura@udzra.jp migtest]$ rake db:migrate
(in /var/web-devel/rails/migtest)
==  CreateViewBlogs: migrating ====================================================
-- create_table(:view_blogs)
   -> 0.0472s
==  CreateViewBlogs: migrated (0.0475s) ===========================================
 
[udzura@udzra.jp migtest]$

RailsでCreate Viewしたい際は、普通に execute しないといけません。なので、そもそも「RailsでView表使うとかあほか」って方もいると思う。引き出しの一つとして。