-
Notifications
You must be signed in to change notification settings - Fork 7
用Migrations指令创建修改表格 & schema
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
做更加灵活的修改。
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