Rails学习-迁移方法

change方法

Rails用于匹配迁移名称的两个模式分别是:add_xxx_to_xxxTable 和 remove_xxx_from_xxxTable, 其中xxx的值会被忽略掉,迁移名称之后的字段名和类型列表才是Rails获取字段信息的地方

  1. 添加字段
# 创建添加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
  1. 移除字段(和添加字段类似)
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