How to create a migration to remove an index only if it exists, rather than throwing an exception if it doesn't?

前端 未结 3 1809
攒了一身酷
攒了一身酷 2021-02-03 18:29

Right now, the current migration might fail, if the books table doesn\'t have created_at or updated_at fields:

class AddTi         


        
3条回答
  •  你的背包
    2021-02-03 18:34

    Rails 6.1+ if_exists / if_not_exists options

    Rails 6.1 added if_exists option to remove_index in order to not raise an error when the index is already removed.

    Rails 6.1 added if_not_exists option to add_index in order to not raise an error when the index is already added.

    As a result, your migration can be rewritten in the following way:

    class AddTimestampIndexes < ActiveRecord::Migration
      def up
        remove_index :books, :created_at, if_exists: true
        remove_index :books, :updated_at, if_exists: true
    
        add_index :books, :created_at
        add_index :books, :updated_at
      end
    
      def down
        remove_index :books, :created_at, if_exists: true
        remove_index :books, :updated_at, if_exists: true
      end
    end
    

    Here is a list of the links to the corresponding PRs:

    • Add if_exists option to remove_index,
    • Fix index options for if_not_exists/if_exists.

提交回复
热议问题