12

Tôi đã cố thêm cột vào bảng sau một cột cụ thể trong bảng. Dưới đây là những gì tôi đã làm:ruby ​​trên đường ray thêm cột sau tên cột cụ thể

rails generate migration add_reaction_id_to_patient_allergies reaction_id: integer :after => 'patient_id' 

Đây là những gì tập tin chuyển đổi của tôi trông giống như:

class AddReactionIdToPatientAllergies < ActiveRecord::Migration 
    def change 
    add_column :patient_allergies, :reaction_id, :string 
    add_column :patient_allergies, :integer, :string 
    add_column :patient_allergies, :, :after 
    add_column :patient_allergies, :=, :string 
    end 
end 

Tôi không nghĩ rằng các lệnh diễn ra tốt đẹp. Tôi thấy một '=' trong tập tin trên. Tôi không nghĩ nó nên ở đó. Ai đó có thể cho tôi biết nếu tôi bỏ lỡ bất cứ điều gì?

Nếu có, làm cách nào để hoàn tác các bước trên?

Trả lời

38

Tôi nghi ngờ nó cho phép bạn thực sự rake db:migrate di chuyển này, vì vậy bạn không cần phải quay trở lại. Chỉ cần xóa ba phần dưới cùng là add_column s và thay thế phần trên cùng bằng

add_column :patient_allergies, :reaction_id, :integer, after: :patient_id 

và bạn nên di chuyển. Để tham khảo trong tương lai, đây là những gì mà bạn cho vào lệnh sẽ giống như thế:

rails generate migration add_reaction_id_to_patient_allergies reaction_id:integer 

Không gian trước integer làm máy phát điện nghĩ đó là một cột mới. Đáng buồn là bạn không thể sử dụng cú pháp Ruby (a => b) trên dòng lệnh.

+1

@michael Chỉ cần thêm một điều nữa vào câu trả lời tuyệt vời này, để hoàn tác quá trình di chuyển thành công nhưng không mong muốn, bạn có thể làm rake db: rollback - điều này đảo ngược quá trình di chuyển gần đây nhất. Bạn có thể lùi lại bằng cách lặp lại nó. Tôi thường thấy mình hoàn tác để thực hiện các chỉnh sửa nhỏ, chẳng hạn như đặt giá trị mặc định hoặc thứ tự cột – Polsonby

+3

Tùy chọn ': after' không được bao gồm trong [tài liệu API] (http://api.rubyonrails.org/classes /ActiveRecord/Migration.html), ít nhất là cho Rails 4.2.3. Phát hiện sau khi thử: quá trình di chuyển đã ổn nhưng lệnh không được áp dụng. – nandinga

+0

@nandinga Dường như lớp [ColumnDefinition] (https://github.com/rails/rails/blob/master/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb#L13) trong Rails mới nhất vẫn hỗ trợ tùy chọn 'after', mặc dù tôi chưa thử nghiệm điều này trong vài bản phát hành cuối cùng của Rails. – piersadrian

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