Skip to content

用Migrations指令创建修改表格 & schema

Yalin edited this page Aug 5, 2016 · 2 revisions

创建表格

rails g migration Create<TableName>Table [columnName:type] [columnName:type]

举例,创建一个名为Products的表格,包含title和price这2列,类型分别是string和float。

跑指令rails g migration CreateProducts title:string price:float,生成的数据库文件。

  class CreateProducts < ActiveRecord::Migration[5.0]
    def change
      create_table :products do |t|
        t.string :title
        t.float :price
      end
    end
  end

rake db:migrate,更新schema。

ActiveRecord::Schema.define(version: 20160805041849) do

  create_table "products", force: :cascade do |t|
    t.string "title"
    t.float  "price"
  end

end

添加行

rails g migration Add<Anything>To<TableName> [columnName:type]

举例,在Products的表格中,添加一列quantity,类型为integer。

跑指令rails g migration AddQuantityToProducts quantity:integer,生成的数据库文件。

class AddQuantityToProducts < ActiveRecord::Migration[5.0]
  def change
    add_column :products, :quantity, :integer
  end
end

rake db:migrate,更新schema。可以看到quatity这一列已经添加进去了。

ActiveRecord::Schema.define(version: 20160805042454) do

  create_table "products", force: :cascade do |t|
    t.string  "title"
    t.float   "price"
    t.integer "quantity"
  end

end

移除行

rails g migration Remove<Anything>To<TableName> [columnName:type]

举例,移除刚刚添加的那一行quantity。

跑指令rails g migration RemoveQnantityFromProducts quantity:integer,生成的数据库文件。

class RemoveQuantityFromProducts < ActiveRecord::Migration[5.0]
  def change
    remove_column :products, :quantity, :integer
  end
end

rake db:migrate,更新schema。可以看到quantity那一列已经移除。

ActiveRecord::Schema.define(version: 20160805042834) do

  create_table "products", force: :cascade do |t|
    t.string "title"
    t.float  "price"
  end

end

添加空的migration

做更加灵活的修改。

rails g migration <name>

举例,为price添加默认值1.0。

rails g migration AddPriceDefaultValue,在生成的数据库文件里,添加change_column :products, :price, :float, default:1.0

class AddPriceDefaultValue < ActiveRecord::Migration[5.0]
  def change
    change_column :products, :price, :float, default:1.0
  end
end

rake db:migrate,更新schema。可以看出price上已经有了默认值1.0。

ActiveRecord::Schema.define(version: 20160805043112) do

  create_table "products", force: :cascade do |t|
    t.string "title"
    t.float  "price", default: 1.0
  end

end