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。