Rails 迁移,如何以批处理方式向表中添加多列

fgu*_*len 0 migration optimization ruby-on-rails alter-table

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

rails g migration AddColumnsToUser col1:integer col2:integer .. etc.
Run Code Online (Sandbox Code Playgroud)

这将生成包含几行的迁移:

def change
  add_column :users, :col1, :integer
  add_column :users, :col2, :integer
end
Run Code Online (Sandbox Code Playgroud)

这将在几个alter table命令中转换为后端数据库:

ALTER TABLE users ADD COLUMN col1 SMALLINT(6) NOT NULL;
ALTER TABLE users ADD COLUMN col2 SMALLINT(6) NOT NULL;
Run Code Online (Sandbox Code Playgroud)

问题是如果你正在处理一个大表,每一个alter table都会花费很多时间,在 MySQL 中更少,因为后端引擎会生成一个表的重复,并且会做很多昂贵的过程。所有这些工作都必须为我要添加的每一列完成。

所以,我的问题是,我怎样才能将所有这些add_column句子聚合成一个,这样结果将是alter table批处理模式,如下所示:

ALTER TABLE users
    ADD COLUMN col1 SMALLINT(6) NOT NULL,
    ADD COLUMN col2 SMALLINT(6) NOT NULL;
Run Code Online (Sandbox Code Playgroud)