JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Languages on JVM » JRuby  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to postflat modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 ActiveRecord::Migration 教學
koji

秒速5センチメートル

站長

發文: 8415
積分: 19
於 2007-12-13 20:58 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
利用ActiveRecord::Migration可以方便升級降級db到某個指定版本
也比較不會漏掉更改過程的內容

產生的migration檔案內會有一個class像這樣
1
2
3
4
5
6
7
8
9
class CreateDogs < ActiveRecord::Migration
  def self.up
    ...
  end
 
  def self.down
    ...
  end
end


裡面就是升級跟降級時所做的處理

因為現在在2.0.1開發
所以就從無到有開始XD
使用
ruby script/scaffold Dog name:string owner:references

可以看到migration下面有了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class CreateDogs < ActiveRecord::Migration
  def self.up
    create_table :dogs do |t|
      t.string :name
      t.references :owner
 
      t.timestamps
    end
  end
 
  def self.down
    drop_table :dogs
  end
end


會發現在1.x時 code長
1
t.column :name, :string

現在變成
1
t.string :name


這時候db內都還沒有table, 所以接下來執行migrate
在netbeans6下可以用Migrate Database->To Current Version來做
就會發現db裡面開了一個table dogs
1
2
3
4
5
6
7
8
9
10
11
mysql> describe dogs;
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int(11)      | NO   | PRI | NULL    | auto_increment |
| name       | varchar(255) | YES  |     | NULL    |                |
| owner_id   | int(11)      | YES  |     | NULL    |                |
| created_at | datetime     | YES  |     | NULL    |                |
| updated_at | datetime     | YES  |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)


然後可以看到因為是第一次create table
所以有呼叫create_table
其他methods可以看這邊
http://api.rubyonrails.com/classes/ActiveRecord/Migration.html

那麼現在既然新增好了, 過了一陣子想加上欄位
那就透過
ruby script/generate migration AddColumnsToDog age :integer
netbeans下就直接輸入AddAgeToDogs age:integer就可以了
讓他產生一個migration檔案002_add_age_to_dog
裡面就會是
1
2
3
4
5
6
7
8
9
class AddAgeToDogs < ActiveRecord::Migration
  def self.up
    add_column :dogs, :age, :integer
  end
 
  def self.down
    remove_column :dogs, :age
  end
end


在執行一下migrate
1
2
3
4
5
6
7
8
9
10
11
12
mysql> describe dogs;
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int(11)      | NO   | PRI | NULL    | auto_increment |
| name       | varchar(255) | YES  |     | NULL    |                |
| owner_id   | int(11)      | YES  |     | NULL    |                |
| created_at | datetime     | YES  |     | NULL    |                |
| updated_at | datetime     | YES  |     | NULL    |                |
| age        | int(11)      | YES  |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)


就有了!!

可以在mysql下
SELECT * FROM schema_info;
就會發現版本資訊就存在這!!

如果對create table加上option可以試試看
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class CreateDogs < ActiveRecord::Migration
  def self.up
    options = {
      :primary_key => "serial",   
      :options     => "DEFAULT CHARSET=UTF8"
    }
    create_table :dogs, options do |t|
      t.string :name
      t.references :owner
 
      t.timestamps
    end
  end
 
  def self.down
    drop_table :dogs
  end
end


就會發現原本的id變serial了!!!

還可以在migration裡面直接下sql
(透過ActiveRecord::Base.connection.execute)
1
2
3
4
5
6
7
8
9
10
11
12
13
class TestExecute < ActiveRecord::Migration
  def self.up
    execute(<<-SQL)  
      create table lala(name varchar(15));
    SQL
  end
 
  def self.down
     execute(<<-SQL)  
       drop table lala;
     SQL
  end
end


參照
http://api.rubyonrails.com/classes/ActiveRecord/ConnectionAdapters/TableDefinition.html
http://api.rubyonrails.com/classes/ActiveRecord/Migration.html

就可以光靠它來對db做操作囉.

koji


reply to postreply to post
JCConf Taiwan 2015 開始售票了!!
Facebook上的TWJUG社團,歡迎加入
話題樹型展開
人氣 標題 作者 字數 發文時間
1525 ActiveRecord::Migration 教學 koji 3788 2007-12-13 20:58
1287 Re:ActiveRecord::Migration 教學 morrison4u 268 2007-12-15 17:18
1257 Re:ActiveRecord::Migration 教學 koji 68 2007-12-15 18:32
1267 Re:ActiveRecord::Migration 教學 morrison4u 120 2007-12-16 21:31
1255 Re:ActiveRecord::Migration 教學 morrison4u 281 2007-12-16 22:33
1331 Re:ActiveRecord::Migration 教學 koji 73 2007-12-17 00:51
» JWorld@TW »  Languages on JVM » JRuby

reply to postflat modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8