rails中兩種回滾-reversible和revert區別

c3tc3tc3t發表於2016-06-17

1 通常遷移內容寫在change方法中 ,但是有些遷移內容不能自動通過執行rake:rollback回滾, 所以在遷移檔案裡要使用 reversible 方法,告訴rails如何回滾例如下面

# coding: utf-8
class ExampleMigration < ActiveRecord::Migration
  def change
    create_table :distributors do |t|
      t.string :zipcode
    end

    reversible do |dir|
      dir.up do
        # add a CHECK constraint
        execute <<-SQL
                  ALTER TABLE distributors
                  ADD CONSTRAINT zipchk
                  CHECK (char_length(zipcode) = 5) NO INHERIT;
                SQL
      end
      dir.down do #這裡寫上如何回滾
        execute <<-SQL
                  ALTER TABLE distributors
                  DROP CONSTRAINT zipchk
                SQL
      end
    end

    add_column :users, :home_page_url, :string
    rename_column :users, :email, :email_address
  end
end

  

所以 reversible 的down呼叫,是在你執行rake db:rollback裡 ,說白了,就是當你執行rollback的時候,reversible裡的down起作用,同時up,down和reversible是等價的功能,就是up,down是分開寫 ,reversible的down也是在rollback呼叫的時候呼叫,up在migration執行時起作用


2 revert是在你執行 是在你執行 rake db:migrate  同時,取消上一個遷移檔案的操作,這裡需要傳遞上一個遷移檔案的類名給revert,同時引用上一個遷移檔案 require_relative 'xxx.rb',

require_relative '2012121212_example_migration' #相對引用上一個遷移檔案
class FixupExampleMigration < ActiveRecord::Migration
  def change
    revert ExampleMigration  #這裡是上一個遷移檔案的類名,這時,如果上一個遷移檔案change裡程式碼可以自動回滾就自動回滾,如果裡面有up,down或者reversible就呼叫這三個來回滾
    create_table(:apples) do |t|
      t.string :variety
    end
  end
end

  


3 當你要撤銷的遷移檔案裡沒有使用reversible或者up,down時,你也不想執行rollback回滾,這時 revert也可以傳遞一個塊,這樣 你可以在塊裡面使用reversible進行具體操作,

class DontUseConstraintForZipcodeValidationMigration < ActiveRecord::Migration
  def change
    revert do
      # copy-pasted code from ExampleMigration
      reversible do |dir|
        dir.up do
          # add a CHECK constraint
          execute <<-SQL
ALTER TABLE distributors
ADD CONSTRAINT zipchk
CHECK (char_length(zipcode) = 5);
SQL
        end
        dir.down do
          execute <<-SQL
ALTER TABLE distributors
DROP CONSTRAINT zipchk
SQL
        end
      end

      # The rest of the migration was ok
    end
  end
end

  



相關文章