2014-02-15 2 views
24

Gerade jetzt könnte die aktuelle Migration fehlschlagen, wenn die books Tabelle nicht created_at oder updated_at Felder hat:Wie erstellt man eine Migration, um einen Index nur zu entfernen, wenn er existiert, und keine Ausnahme auszulösen, wenn dies nicht der Fall ist?

class AddTimestampIndexes < ActiveRecord::Migration 
    def up 
    remove_index :books, :created_at 
    remove_index :books, :updated_at 

    add_index :books, :created_at 
    add_index :books, :updated_at 
    end 

    def down 
    remove_index :books, :created_at 
    remove_index :books, :updated_at 
    end 
end 

Keinerlei Optionen remove_index nehmen zu leise gehen, wenn er den Index eher zu entfernen, nicht als eine Anhebung Error?

Antwort

41

Sie können die Methode index_exists? innerhalb Ihrer Migration verwenden, um zu testen, ob der Index, den Sie entfernen müssen, tatsächlich vorhanden ist.

in der Dokumentation Werfen Sie einen Blick hier: http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/index_exists%3F

ich es nicht getestet haben, aber man sollte so etwas wie diese in der Lage sein zu verwenden:

class AddTimestampIndexes < ActiveRecord::Migration 
    def up 
    remove_index :books, :created_at if index_exists?(:books, :created_at) 
    remove_index :books, :updated_at if index_exists?(:books, :updated_at) 

    add_index :books, :created_at 
    add_index :books, :updated_at 
    end 

    def down 
    remove_index :books, :created_at 
    remove_index :books, :updated_at 
    end 
end 

Obwohl durch die Blicke der Dinge willst du sie wirklich nur erstellen, wenn sie nicht existieren? Dies könnte für Ihre Migration geeigneter sein:

class AddTimestampIndexes < ActiveRecord::Migration 
    def up 
    add_index :books, :created_at unless index_exists?(:books, :created_at) 
    add_index :books, :updated_at unless index_exists?(:books, :updated_at) 
    end 

    def down 
    remove_index :books, :created_at 
    remove_index :books, :updated_at 
    end 
end