change_table bulk: true
class ChangeTableNameDefaultValues < ActiveRecord::Migration[7.2]
def change
change_table :table_name, bulk: true do |t|
# Notice here that I don't use the t variable being passed
# to the block. I'm wondering if I need to call a method on t?
change_column_default(:table_name, :column_1, from: 'old_default_value', to: 'new_default_value')
change_column_default(:table_name, :column_2, from: 'old_default_value', to: 'new_default_value')
end
end
end
,但是,在运行迁移后,我得到了以下输出:
Migrating to ChangeTableNameDefaultValues (20250221054551)
== 20250221054551 ChangeTableNameDefaultValues: migrating ======================
-- change_table(:table_name, {:bulk=>true})
-- change_column_default(:table_name, :column_1, {:from=>"old_default_value", :to=>"new_default_value"})
TRANSACTION (0.0ms) BEGIN
(2.4ms) ALTER TABLE "table_name" ALTER COLUMN "column_1" SET DEFAULT 'new_default_value'
-> 0.0046s
-- change_column_default(:table_name, :column_2, {:from=>"old_default_value", :to=>"new_default_value"})
(0.5ms) ALTER TABLE "table_name" ALTER COLUMN "column_2" SET DEFAULT 'new_default_value'
-> 0.0017s
-> 0.0072s
== 20250221054551 ChangeTableNameDefaultValues: migrated (0.0072s) =============
因此,它没有利用散装表更新。我想知道是否可以通过更改列的默认值??
问题是您需要使用change_default
。
change_default
使用表中表的上下文,而
change_table
则将表作为显式参数并做出自己的语句。
,类似...
change_column_default
注意这不是可逆的。
change_table中可用的方法列表为here。