`
jiajie0531
  • 浏览: 27543 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Rails Database Migrations 2 Creating a Migration 创建一个数据迁移

阅读更多

version: rails 4.1

 

2 创建一个数据迁移

2.1 Creating a Standalone Migration 创建一个单独的数据迁移

migrations 被保存为文件,位于在 db/migrate 目录里,一个文件对应于一个migration class。文件名的格式是 YYYYMMDDHHMMSS_create_products.rb,那是一个 UTC 时间戳用来区分migration,遵循的规则就是用下划线来间隔migration的命名。migration class 的命名(骆驼命名法)应该是文件名的最后一部分。例如 20080906120000_create_products.rb 应该定义的是类 CreateProducts,20080906120001_add_details_to_products.rb 应该定义的时 AddDetailsToProducts。Rails用这个时间戳来决定哪个migration应该被运行和什么顺序,因此如果你从另外一个应用中拷贝一个 migration,或者你自己生成一个文件,要注意的它的在顺序中的位置。

 

当然,计算时间戳是没有乐趣的,因此 Active Record 提供了一个生成器来为你处理它:

$ bin/rails generate migration AddPartNumberToProducts

这会产生一个空的,但有符合规则命名的 migration :

classAddPartNumberToProducts < ActiveRecord::Migration

  defchange

  end

end

如果 migration 名称是“AddXXXToYYY”或者“RemoveXXXFromYYY”的格式,紧接在后面的是一系列的列名和类型,然后一个 migration 包含了合适的 add_column 和 remove_column 语句将会被创建。

$ bin/rails generate migration AddPartNumberToProducts part_number:string

将会创建

classAddPartNumberToProducts < ActiveRecord::Migration

  defchange

    add_column :products, :part_number, :string

  end

end

如果你想要对于一个新的数据列上增加一个索引,你能够这样来实现:

$ bin/rails generate migration AddPartNumberToProducts part_number:string:index

将会创建

classAddPartNumberToProducts < ActiveRecord::Migration

  defchange

    add_column :products, :part_number, :string

    add_index :products, :part_number

  end

end

类似的,你可以生成一个 migration 从命令行来移除一个数据列:

$ bin/rails generate migration RemovePartNumberFromProducts part_number:string

生成

classRemovePartNumberFromProducts < ActiveRecord::Migration

  defchange

    remove_column :products, :part_number, :string

  end

end

你是不受限制地来魔术般的生成数据列。例如:

$ bin/rails generate migration AddDetailsToProducts part_number:string price:decimal

生成

classAddDetailsToProducts < ActiveRecord::Migration

  defchange

    add_column :products, :part_number, :string

    add_column :products, :price, :decimal

  end

end

如果 migration 名称是“CreateXXX”的格式,后面接下来的是一系列的数据列名和类型,然后一个 migration 创建数据表 XXX 和其罗列的数据列将会被生成。例如:

$ bin/rails generate migration CreateProducts name:string part_number:string

生成

classCreateProducts < ActiveRecord::Migration

  defchange

    create_table :productsdo|t|

      t.string :name

      t.string :part_number

    end

  end

end

正如平常,在开始阶段就已经为你生成好了。正如你所看到的,你能够在其中增加或者删除,通过编辑 db/migrate/YYYYMMDDHHMMSS_add_details_to_products.rb 文件。

同样的,生成器会接受数据列类型作为引用(同样也适用于 belongs_to)。例如:

$ bin/rails generate migration AddUserRefToProducts user:references

生成

classAddUserRefToProducts < ActiveRecord::Migration

  defchange

    add_reference :products, :user, index: true

  end

end

这个 migration 将会创建一个 user_id 数据列作为一个索引。

如果JoinTable 是名称的一部分,那么生成器也会产生关联数据表:

$ bin/rails g migration CreateJoinTableCustomerProduct customer product

将会产生接下来的 migration:

classCreateJoinTableCustomerProduct < ActiveRecord::Migration

  defchange

    create_join_table :customers, :productsdo|t|

      # t.index [:customer_id, :product_id]

      # t.index [:product_id, :customer_id]

    end

  end

end

2.2 Model Generators 模型生成器

模型和 scaffold 生成器将会创建 migrations,其恰当地增加一个新的数据列。这个 migration 为了创建关联的数据表,将会包含其命令。如果你告诉Rails,你想要什么数据列,那么为了增加这些列的语句同样也会被创建。例如,运行:

$ bin/rails generate model Product name:string description:text

将会创建一个类似于下面的 migration:

classCreateProducts < ActiveRecord::Migration

  defchange

    create_table :productsdo|t|

      t.string :name

      t.text :description

 

      t.timestamps

    end

  end

end

你能够增加任何你想要的数据列名或者类型。

2.3 Supported Type Modifiers 支持类型修改

你同样能够详细声明一些属性,就在花括号中的字段类型之后。你可以做下面的一些修改:

  • 限制设置 string/text/binary/integer  字段的最大长度。
  • 对于 decimal 字段的精确性做定义,表示该数字总共多少位。
  • 对于 decimal 字段的小数位做定义,表示该数字在小数点后的位数。
  • 多态,为了关联 belongs_to 增加一个类型的数据列。
  • null,允许或者不允许 NULL 存在于数据列中。

例如,运行:

$ bin/rails generate migration AddDetailsToProducts 'price:decimal{5,2}' supplier:references{polymorphic}

将会产生一个类似于这样的 migration:

classAddDetailsToProducts < ActiveRecord::Migration

  defchange

    add_column :products, :price, :decimal, precision: 5, scale: 2

    add_reference :products, :supplier, polymorphic: true, index: true

  end

end

 

 

original url:http://guides.rubyonrails.org/migrations.html#creating-a-migration

0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics