Rails学习-迁移方法
change方法
Rails用于匹配迁移名称的两个模式分别是:
add_xxx_to_xxxTable和remove_xxx_from_xxxTable, 其中xxx的值会被忽略掉,迁移名称之后的字段名和类型列表才是Rails获取字段信息的地方
- 添加字段
# 创建添加quantity字段到line_items表的迁移
# add_quantity_to_line_items是迁移名称,并告诉Rails需要添加字段的表名,
# quantity:integer告诉Rails添加的字段名称和类型,这样就会自动生成 add_column 那一行
bin/rails generate migration add_quantity_to_line_items quantity:integer
生成的迁移文件如下:
class AddQuantityToLineItems < ActiveRecord::Migration[7.0]
def change
add_column :line_items, :quantity, :integer
end
end
- 移除字段(和添加字段类似)
bin/rails g migration remove_quantity_from_line_items quantity:integer
生成的迁移文件如下:
class RemoveQuantityFromLineItems < ActiveRecord::Migration[7.0]
def change
remove_column :line_items, :quantity, :integer
end
end
可以使用up和down方法以传统风格编写迁移而不使用change方法。
up方法用于描述对数据库模式所做的改变,down方法用于撤销up方法所做的改变。
换句话说,如果调用up方法之后紧接着调用down方法,数据库模式不会发生任何改变。
例如用up方法创建数据表,就应该用down方法删除这个数据表。
在down方法中撤销迁移时,明智的做法是按照和up方法中操作相反的顺序执行操作。
up方法
用于对数据库模式做修改 执行
bin/rails db:migrate命令时会被调用执行
# 生成一个迁移文件用于测试
bin/rails g migration something
添加up方法
class Something < ActiveRecord::Migration[7.0]
# 记得删除默认生成的空的change方法
# 创建一个表
def up
create_table :people do |t|
t.string :name
t.integer :age
t.timestamps
end
end
end
# 查看迁移状态
bin/rails db:migrate:status
# 输出如下:
database: db/development.sqlite3
Status Migration ID Migration Name
--------------------------------------------------
up 20240316032753 Create products
up 20240320055343 Create carts
up 20240320060656 Create line items
up 20240323132057 Add quantity to line items
up 20240323133840 Combine items in cart
down 20240325092635 Something
此时数据库中还没有people这张表,执行迁移后,就会生成
bin/rails db:migrate
# 输出如下:
== 20240325092635 Something: migrating ========================================
-- create_table(:people)
-> 0.0022s
== 20240325092635 Something: migrated (0.0023s) ===============================
执行迁移后,查看迁移状态,发现变为up状态了
bin/rails db:migrate:status
# 输出如下:
database: db/development.sqlite3
Status Migration ID Migration Name
--------------------------------------------------
up 20240316032753 Create products
up 20240320055343 Create carts
up 20240320060656 Create line items
up 20240323132057 Add quantity to line items
up 20240323133840 Combine items in cart
up 20240325092635 Something
down方法
用于撤销之前的up操作对数据库模式的修改 执行
bin/rails db:rollback命令时会被调用执行
class Something < ActiveRecord::Migration[7.0]
# 省略之前的up方法
...
# 删除up创建的表
def down
drop_table :people
end
end
撤销之前的建表操作
bin/rails db:rollback
# 输出如下:
== 20240325092635 Something: reverting ========================================
-- drop_table(:people)
-> 0.0017s
== 20240325092635 Something: reverted (0.0017s) ===============================
再次查看迁移状态,发现变为down状态了
bin/rails db:migrate:status
database: db/development.sqlite3
Status Migration ID Migration Name
--------------------------------------------------
up 20240316032753 Create products
up 20240320055343 Create carts
up 20240320060656 Create line items
up 20240323132057 Add quantity to line items
up 20240323133840 Combine items in cart
down 20240325092635 Something