1.简介

在rails中用migration可以很方便的管理数据库的结构。可以创建数据库,创建表,删除表,添加字段,删除字段,整理数据。

migration就是一系列的class,这些类都继承了ActiveRecord::Migration类。

class CreateProducts < ActiveRecord::Migration 
  def up 
    create_table :products do |t| 
      t.string :name 
      t.column :description, :text 
      t.timestamps 
    end 
  end 
     
  def down 
    drop_table :products 
  end  
end

上面就是一个migration例子。up方法中的代码会在

rake db:migrate

之后执行。

down方法中的代码会在

rake db:rollback

之后执行。

t.timestamps会自动产生created_at和updated_at列。

还可以进行表结构修改。

class AddReceiveNewsletterToUsers < ActiveRecord::Migration 
  def up 
    change_table :users do |t| 
      t.boolean :receive_newsletter, :default => false
    end 
    User.update_all ["receive_newsletter = ?", true] 
  end 
      
  def down 
    remove_column :users, :receive_newsletter 
  end 
end

rails3.1之后产生了一个新的方法change,主要用来创建表和列,不用写一对up和down了,使用rake db:rollback回滚的时候数据库不用down方法也知道如何做了。

1.1.migration提供了很多的方法

   add_column
   add_index
   change_column
   change_table
   create_table
   drop_table
   remove_column
   remove_index
   rename_column

如果想回滚migration对数据库造成的改变,可以使用rake db:rollback命令。

1.2.ActiveRecord支持的列类型

   :binary
   :boolean
   :date
   :datetime
   :decimal
   :float
   :integer
   :primary_key
   :string
   :text
   :time
   :timestamp

2.创建migration

2.1.创建model

rails generate model Product name:string description:text

创建的migration文件位于db/migrate目录,文件名称为yyyymmddmmss_create_products.rb。

class CreateProducts < ActiveRecord::Migration 
  def change 
    create_table :products do |t| 
      t.string :name 
      t.text :description 
      
      t.timestamps 
    end 
  end 
end

2.2.创建单独的migration

   rails generate migration AddPartNumberToProduct

class AddPartNumberToProducts < ActiveRecord::Migration 
  def change 
  end 
end

指定列的名称

   rails generate migration AddPartNumberToProduct part_number:string

class AddPartNumberToProducts < ActiveRecord::Migration 
  def change 
    add_column :products, :part_number, :string
  end 
end

删除列
   rails generate migration RemovePartNumberToProduct part_number:string

class RemovePartNumberFromProducts < ActiveRecord::Migration 
  def up 
    remove_column :products, :part_number 
  end 
     
  def down 
    add_column :products, :part_number, :string
  end 
end

还可以添加多个列

rails generate migration AddDetailsToProducts part_number:string price:decimal
     
     
class AddDetailsToProducts < ActiveRecord::Migration 
  def change 
    add_column :products, :part_number, :string
    add_column :products, :price, :decimal
  end 
end

3.编写mirgation

3.1.创建表

create_table :products do |t| 
     
  t.string :name 
     
end 
     
create_table :products do |t| 
     
  t.column :name, :string, :null => false
     
end

如果数据库是mysql,还可以通过下面的语句指定使用的引擎,mysql默认的引擎是InnoDB。

create_table :products, :options => "ENGINE=MyISAM" do |t| 
  t.string :name, :null => false
end

3.2.修改表结构

change_table :products do |t| 
  t.remove :description, :name 
  t.string :part_number 
  t.index :part_number 
  t.rename :upccode, :upc_code 
end

删除name,description字段,添加part_number字段,在part_number字段建立索引,重命名upccode为upc_code。

3.3.辅助工具

t.timestamps可以自动添加created_at 和 updated_at列。

#创建表的同时添加 
create_table :products do |t| 
  t.timestamps 
end 
     
#给已经存在的表添加 
change_table :products do |t| 
  t.timestamps 
end

还有一个帮助工具references,用来指明表的外键关系。

create_table :products do |t| 
  t.references :category 
end

上面的代码会在products表中添加一个外键字段category_id。

create_table :products do |t| 
  t.references :attachment, :polymorphic => {:default => 'Photo'} 
end

上面的代码不仅会在products表中添加外键字段attachment_id,还会添加attachment_type字段,string类型,默认值是Photo。