2015-04-20 91 views
2

我想知道當回滾遷移文件時,如果Rails有execute和一些原始SQL語句,它會執行什麼操作。回滾Rails遷移並執行

這裏是一個人爲的例子:

def change 
    add_column :my_table, :new_column 
    execute "update my_table set new_column = some_value where some_condition" 
end 

當回滾此遷移,並滑軌默默地忽略遷移的execute部分?

+0

你想知道會發生什麼或如何回滾這種變化? – dx7

+0

@ dx7正如問題中所寫,我想知道如果我試圖回滾此更改,Rails將執行什麼操作。 –

+0

嘗試:-)會不會更快? –

回答

1

如果您在command_recorder.rb看(在活動記錄寶石),那麼你會看到一些遷移方法(如add_column)都有相應invert_foo方法這扭轉了變化。如果沒有相應的invert方法,則導軌將引發錯誤。這是因爲它無法知道如何反轉任意語句。

如果你希望你的遷移是可逆的,那麼你需要告訴rails如何反轉它。造成這種情況的一般形式是

reversible do |direction| 
    direction.up { ... } 
    direction.down {...} 
end 

向上和向下的方法可以根據需要被稱爲很多次,如果方向一致的遷移是否正在運行或正在回滾只會屈服於塊。

在你的情況下,這只是

reversible do |direction| 
    direction.up { execute "..." } 
end 

既然你不需要撤消更改列列是否將被丟棄。

+0

不知道這一個。謝謝。嘗試可能會更快,但其他人可能會在網上尋找相同的答案。 –

0

我會承擔很多。您應該將其分解爲上移和下移。

下應該是這個樣子:

def down 
    raise ActiveRecord::IrreversibleMigration 
end