2011-07-20 38 views
5

Tôi có một bảng có tên là profiles với một số cột.Đường ray 3.1 thêm cột có thể di chuyển có thể thay đổi được

Bây giờ tôi muốn thêm một vài cột vào bảng này bằng cách sử dụng change -method trong đường ray 3.1. Tôi tạo ra một sự chuyển đổi với đoạn mã sau:

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

Việc chuyển hoạt động hoàn hảo, nhưng khi tôi muốn rollback tôi nhận được

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

Bất cứ ý tưởng tại sao?

Trả lời

5

Di cư tự động tạo ra để thêm cột trong Rails 3.1 được ghi theo dạng:

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

Có lẽ thử cú pháp đó?

+0

gì về việc thêm một tài liệu tham khảo với add_column? Tôi đoán tôi có thể làm điều đó như thế này: http://stackoverflow.com/questions/493777/add-column-for-references-rails/493802#493802 Nhưng sẽ linh hoạt hơn để có thể thêm trực tiếp vào quá trình di chuyển bằng cách nào đó. – martnu

+0

@martnu: Thêm tham chiếu chỉ thêm trường ID kiểu số nguyên vào bảng - bạn có thể sao chép nó bằng 'add_column: profiles,: user_id,: integer'. – sevenseacat

+0

'tham chiếu' cũng thêm một chỉ mục trên cột' assoc_id', có ích. – Jeriko

0

Có vẻ như bạn cần phải nói với sự di cư như thế nào để trở lại bản thân:

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 

Xem http://guides.rubyonrails.org/migrations.html#using-reversible để biết thêm thông tin.

Hoặc bạn có thể thử sử dụng các phương pháp cũ lên xuống mà vẫn có sẵn như vậy:

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 

Thông tin thêm về lên/xuống ở đây: http://guides.rubyonrails.org/migrations.html#using-the-up-down-methods

Các vấn đề liên quan