2009-06-23 12 views

Antwort

13

Dies ist datenbankspezifisch. Tun Sie einfach so etwas wie die folgenden in der Migration:

class MyMigration < ActiveRecord::Migration 
    def self.up 
    create_table :my_table do |t| 
     # ... 
    end 
    execute "ALTER TABLE my_table AUTO_INCREMENT = 1000" # for MySQL 
    end 

    def self.down 
    # ... 
    end 
end 

Oder in der Tat, noch besser, wie Bane vorgeschlagen:

def self.up 
    create_table :my_table, :options => "AUTO_INCREMENT = 1000" do |t| 
     # ... 
    end 
    end 

Seien Sie vorsichtig mit Datenbank-spezifischen Migrationen, aber! Die Verwendung von SQL, das spezifisch für Ihre Datenbank ist, wird die Kompatibilität mit anderen Datenbanken beeinträchtigen und ist im Allgemeinen keine gute Idee.

+0

Migrationen sollten datenbankunabhängig sein. Was ist, wenn die Datenbank, auf der Sie die Migration durchführen, diese Option nicht unterstützt? Die Ausführung wird wahrscheinlich eine Ausnahme auslösen. Ich würde stattdessen den Befehl direkt in der Datenbank ausführen. BTW, ich stimme der Lösung zu. –

+0

@weppos, wenn Sie es direkt in einer Datenbank ausführen, werden Sie den Vorteil von Migrationen verlieren, mit denen Sie Ihr Datenbankschema problemlos auf andere Server portieren können. Natürlich wird der andere große Vorteil, die Portierung auf eine Datenbank von einem anderen Anbieter, ungültig sein. – molf

+0

Hallo Molf, du verpasst ein Doppelzitat vor AUTO_INCREMENT. –

9

Jede Zeichenfolge, die an die Option ": options" übergeben wird, wird an das Ende der SQL-Anweisung angehängt, die die Tabelle erstellt. Beste Übung.

def self.up 
    create_table :my_table, :options => "AUTO_INCREMENT = 1000" do |t| 
     # ... 
    end 
end 
+0

Es funktioniert nicht auf SQLite & SQL Server – yossico

Verwandte Themen