2009-05-19 1 views
6

Lassen Sie uns sagen, dass ich eine Tabelle in einer Rails-Migration zu erstellen, unter Angabe der ID-Spalte wegzulassen:Kann in einer Rails-Migration angegeben werden, dass eine neu hinzugefügte Spalte vor oder nach einer vorhandenen Spalte in der Tabelle sein sollte?

create_table :categories_posts, :id => false do |t| 
    t.column :category_id, :integer, :null => false 
    t.column :post_id, :integer, :null => false 
end 

Später ich entscheide, möchte ich eine ID-Spalte als Primärschlüssel hinzufügen, damit ich eine neue Migration erstellen:

class ChangeCategoriesToRichJoin < ActiveRecord::Migration 
    def self.up 
    add_column :categories_posts, :id, :primary_key 
    end 

    def self.down 
    remove_column :categories_posts, :id 
    end 
end 

Aber wenn ich am Tisch sehen, nachdem ich wandern, sieht es wie folgt aus:

category_id 
post_id 
id 

die ID-Spalte in der letzten Position in der Tabelle ist, während kein normalerweise wäre eine ID-Spalte die erste.

Gibt es eine Möglichkeit, die ChangeCategoriesToRichJoin-Migration so zu ändern, dass sie auf der ID-Spalte besteht, die VOR der Spalte category_id in der Tabelle erstellt wird?

Oder muss ich die Tabelle löschen und die Spalte in der "create table" Definition hinzufügen?

Antwort

1

Ich konnte die Spalten nicht selbst ordnen, aber mit Rails können Sie einen Rollback durchführen, die alte Migrationsdatei ändern, um die neuen Spalten in der gewünschten Reihenfolge hinzuzufügen, und dann die alte Migration erneut migrieren einschließlich des neuen Feldes. Es ist nicht gerade ideal, aber die Fähigkeit, leicht zu migrieren und zu reflgurtieren, kann funktionieren, wenn OCD genug ist, um die Spaltenreihenfolge zu verlangen. : P

Ich bin kein Experte, aber ich habe eine Menge Rails-Dokumentation (und vor kurzem) gelesen und kann mich nicht erinnern, eine Lösung dafür zu finden.

+0

Das ist mein Verdacht war. Danke für die Bestätigung. –

5

Verwenden :after => :another_column_name, z.B .:

change_table :users do |t| 
    t.integer :like_count, :default => 0, :after => :view_count 
end 
+0

Dies ist die tatsächliche Antwort! Vielen Dank. – digidigo