2011-07-20 13 views
5

Mam jedną tabelę o nazwie profiles z niektórymi kolumnami.Rails 3.1 dodaj kolumny z change_table migration

Teraz chcę dodać kilka kolumn do tej tabeli przy użyciu metody change - metoda w szynach 3.1. I stworzył migracji z następującego kodu:

def change 
    change_table :profiles do |t| 
    t.string :photo 
    t.string :name 
    t.references :user 
    end 
end 

Migracja działa perfekcyjnie, ale gdy chcę wycofać uzyskać

SQLite3::SQLException: duplicate column name: photo: ALTER TABLE "profiles" ADD "photo" varchar(255) 

Jakieś pomysły dlaczego?

Odpowiedz

5

automatycznie wygenerowane migracje do dodawania kolumn w Rails 3.1 jest w formacie:

class AddColumnToTable < ActiveRecord::Migration 
    def change 
    add_column :table, :column, :type 
    end 
end 

Może spróbować tej składni?

+0

Co o dodanie odniesienia z add_column? Myślę, że mógłbym to zrobić tak: http://stackoverflow.com/questions/493777/add-column-for-references-rails/493802#493802 Ale byłoby bardziej elastyczne, aby móc dodać go bezpośrednio w migracji jakoś. – martnu

+0

@martnu: Dodanie referencji powoduje dodanie do tabeli pola ID typu integer - można go powielić za pomocą 'add_column: profiles,: user_id,: integer'. – sevenseacat

+0

'reference' również dodaje indeks do kolumny' assoc_id', co jest przydatne. – Jeriko

0

Wygląda na to trzeba powiedzieć migrację jak odwróci się:

def change 
    change_table :profiles do |t| 
    t.string :photo 
    t.string :name 
    t.references :user 
    end 

    reversible do |dir| 
    dir.down do 
     remove_column :profiles, :photo 
     remove_column :profiles, :name 
     remove_column :profiles, :user_id 
    end 
    end 
end 

Zobacz http://guides.rubyonrails.org/migrations.html#using-reversible aby uzyskać więcej informacji.

Alternatywnie można spróbować przy użyciu starych metod w górę iw dół, które są nadal dostępne tak:

def up 
    change_table :profiles do |t| 
    t.string :photo 
    t.string :name 
    t.references :user 
    end 
end 

def down 
    remove_column :profiles, :photo 
    remove_column :profiles, :name 
    remove_column :profiles, :user_id 
end 

Więcej na górę/w dół tutaj: http://guides.rubyonrails.org/migrations.html#using-the-up-down-methods