当前位置: 代码迷 >> Ruby/Rails >> ruby创造迁移
  详细解决方案

ruby创造迁移

热度:352   发布时间:2016-04-29 02:08:03.0
ruby创建迁移

ruby在创建数据库前要创建迁移。下面就是创建迁移的方法。

迁移文件存储在?db/migrate?文件夹中,每个迁移保存在一个文件中。文件名采用?YYYYMMDDHHMMSS_create_products.rb?形式,即一个 UTC 时间戳后加以下划线分隔的迁移名。迁移的类名(驼峰式)要和文件名时间戳后面的部分匹配。例如,在?20080906120000_create_products.rb?文件中要定义?CreateProducts?类;在?20080906120001_add_details_to_products.rb?文件中要定义?AddDetailsToProducts?类。文件名中的时间戳决定要运行哪个迁移,以及按照什么顺序运行。从其他程序中复制迁移,或者自己生成迁移时,要注意运行的顺序。

自己计算时间戳不是件简单的事,所以 Active Record 提供了一个生成器:

$ rails generate migration AddPartNumberToProducts

?

这个命令生成一个空的迁移,但名字已经起好了:

class AddPartNumberToProducts < ActiveRecord::Migration  def change  endend

?如果迁移的名字是“AddXXXToYYY”或者“RemoveXXXFromYYY”这种格式,而且后面跟着一个字段名和类型列表,那么迁移中会生成合适的?add_column??remove_column?语句。

?

?

?

$ rails generate migration AddPartNumberToProducts part_number:string

?

这个命令生成的迁移如下:

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

?如果想为新建的字段创建添加索引,可以这么做:

?

?

?

$ rails generate migration AddPartNumberToProducts part_number:string:index

?

这个命令生成的迁移如下:

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

?类似地,还可以生成删除字段的迁移:

?

?

?

$ rails generate migration RemovePartNumberFromProducts part_number:string

?这个命令生成的迁移如下:

class RemovePartNumberFromProducts < ActiveRecord::Migration  def change    remove_column :products, :part_number, :string  endend

?迁移生成器不单只能创建一个字段,例如:

?

?

?

$ 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  endend

?如果迁移名是“CreateXXX”形式,后面跟着一串字段名和类型声明,迁移就会创建名为“XXX”的表,以及相应的字段。例如:

?

?

?

$ rails generate migration CreateProducts name:string part_number:string

?

生成的迁移如下:

class CreateProducts < ActiveRecord::Migration  def change    create_table :products do |t|      t.string :name      t.string :part_number    end  endend

?

生成器生成的只是一些基础代码,你可以根据需要修改?db/migrate/YYYYMMDDHHMMSS_add_details_to_products.rb?文件,增删代码。

在生成器中还可把字段类型设为?references(还可使用?belongs_to)。例如:

?

$ rails generate migration AddUserRefToProducts user:references

?生成的迁移如下:

?

class AddUserRefToProducts < ActiveRecord::Migration  def change    add_reference :products, :user, index: true  endend

?

这个迁移会创建?user_id?字段,并建立索引。

如果迁移名中包含?JoinTable,生成器还会创建联合数据表:

?

$ rails g migration CreateJoinTableCustomerProduct customer product

?

?生成的迁移如下:

class CreateJoinTableCustomerProduct < ActiveRecord::Migration  def change    create_join_table :customers, :products do |t|      # t.index [:customer_id, :product_id]      # t.index [:product_id, :customer_id]    end  endend

?

?