Ruby on rails Rails迁移,如何在批处理模式下向表中添加多个列

Ruby on rails Rails迁移,如何在批处理模式下向表中添加多个列,ruby-on-rails,optimization,migration,alter-table,Ruby On Rails,Optimization,Migration,Alter Table,当我想向现有表中添加多列时,我可以这样做: rails g migration AddColumnsToUser col1:integer col2:integer .. etc. 这将生成具有多行的迁移: def change add_column :users, :col1, :integer add_column :users, :col2, :integer end 将在几个alter table命令中转换为后端数据库: ALTER TABLE users ADD COLUM

当我想向现有表中添加多列时,我可以这样做:

rails g migration AddColumnsToUser col1:integer col2:integer .. etc.
这将生成具有多行的迁移:

def change
  add_column :users, :col1, :integer
  add_column :users, :col2, :integer
end
将在几个alter table命令中转换为后端数据库:

ALTER TABLE users ADD COLUMN col1 SMALLINT(6) NOT NULL;
ALTER TABLE users ADD COLUMN col2 SMALLINT(6) NOT NULL;
问题是,如果您处理的是一个大表,那么这些alter table中的每一个都将花费大量的时间,在MySQL中花费的时间更少,因为后端引擎将生成表的副本,并将执行许多昂贵的过程。所有这些工作都必须为我要添加的每一列完成

所以,我的问题是,我如何才能将所有这些add_列语句聚合到一个表中,从而在批处理模式下生成一个alter表,如下所示:

ALTER TABLE users
    ADD COLUMN col1 SMALLINT(6) NOT NULL,
    ADD COLUMN col2 SMALLINT(6) NOT NULL;

如果需要多个语句或自定义sql,请按以下方式操作:

execute <<-SQL
   ALTER TABLE users
    ADD COLUMN col1 SMALLINT(6) NOT NULL,
    ADD COLUMN col2 SMALLINT(6) NOT NULL;
SQL

您可以在迁移中使用带有选项bulk:true的change_表

详情请参阅: