2010-05-10 45 views
284

Chúng tôi có cú pháp script/generate migration add_fieldname_to_tablename fieldname:datatype để thêm cột mới vào mô hình.Di chuyển đường ray cho cột thay đổi

Trên cùng một dòng, chúng ta có tập lệnh/tạo để thay đổi kiểu dữ liệu của một cột không? Hoặc tôi có nên viết SQL trực tiếp vào quá trình di chuyển vani của tôi không?

Tôi muốn thay đổi cột từ datetime thành date.

Trả lời

478

Tôi nghĩ điều này sẽ hiệu quả.

change_column :table_name, :column_name, :date 
+0

tôi đã hy vọng nhiều hơn một kịch bản/tạo tuyến đường di cư. change_column hoạt động tốt trong một di chuyển độc lập – papdel

+13

@b_ayan: theo như tôi biết, các từ phép thuật duy nhất trong tên di chuyển là "thêm" và "xoá". –

+0

Phân loại đường ray noob ở đây, nhưng… Tôi hiểu câu trả lời nhưng không phải là ý kiến ​​về câu trả lời này. Giải thích được đánh giá cao :) –

93

Bạn cũng có thể sử dụng khối nếu bạn có nhiều cột thay đổi trong bảng.

Ví dụ:

change_table :table_name do |t| 
    t.change :column_name, :column_type, {options} 
end 

Xem API documentation on the Table class để biết thêm chi tiết.

80

Tôi không biết liệu bạn có thể tạo di chuyển từ dòng lệnh để thực hiện tất cả điều này hay không, nhưng bạn có thể tạo di chuyển mới, sau đó chỉnh sửa di chuyển để thực hiện thao tác này.

Nếu tablename là tên bảng của bạn, tên trường là tên trường của bạn và bạn muốn thay đổi từ ngày giờ sang ngày, bạn có thể viết di chuyển để thực hiện việc này.

Bạn có thể tạo một sự chuyển đổi mới với:

rails g migration change_data_type_for_fieldname 

Sau đó chỉnh sửa chuyển đổi sang sử dụng change_table:

class ChangeDataTypeForFieldname < ActiveRecord::Migration 
    def self.up 
    change_table :tablename do |t| 
     t.change :fieldname, :date 
    end 
    end 
    def self.down 
    change_table :tablename do |t| 
     t.change :fieldname, :datetime 
    end 
    end 
end 

Sau đó chạy di cư:

rake db:migrate 
23

Như tôi đã tìm thấy bằng cách các câu trả lời trước, cần ba bước để thay đổi loại cột:

Bước 1:

Tạo một file mới di cư sử dụng mã này:

rails g migration sample_name_change_column_type 

Bước 2:

Đến /db/migrate thư mục và chỉnh sửa các tập tin chuyển đổi bạn đã thực hiện. Có hai giải pháp khác nhau.

  1. def change 
        change_column(:table_name, :column_name, :new_type) 
    end 
    

2.

def up 
     change_column :table_name, :column_name, :new_type 
    end 

    def down 
     change_column :table_name, :column_name, :old_type 
    end 

Bước 3:

Đừng quên để làm lệnh này:

rake db:migrate 

Tôi đã thử nghiệm giải pháp này cho Rails 4 và nó hoạt động tốt.

+1

Ở bước 2, đầu tiên sẽ thất bại sau khi chạy rake db: rollback, tôi khuyên bạn nên kiểm tra số thứ hai – Feuda

+0

Có quy ước đường ray cho phép mọi thứ được thực hiện nhiều hay ít khi tạo tệp di chuyển mà không cần đến nó, sau đó chỉnh sửa nó? – BKSpurgeon

+0

@BKSpurgeon Có, hãy xem tài liệu tại đây: http://edgeguides.rubyonrails.org/active_record_migrations.html –

0

Một cách khác để thay đổi kiểu dữ liệu sử dụng di cư

bước 1: Bạn cần phải xoá tên faulted trường loại dữ liệu sử dụng di cư

ví dụ:

rails g migration RemoveFieldNameFromTableName field_name:data_type 

Ở đây đừng quên chỉ định loại dữ liệu cho trường của bạn

Bước 2: Bây giờ bạn có thể thêm lĩnh vực với kiểu dữ liệu chính xác

ví dụ:

rails g migration AddFieldNameToTableName field_name:data_type 

Vậy là xong, bây giờ bảng của bạn sẽ thêm với trường loại dữ liệu chính xác, Happy ruby ​​mã hóa !!

1

Chỉ cần tạo di cư:

rails g migration change_column_to_new_from_table_name 

Cập nhật di cư như thế này:

class ClassName < ActiveRecord::Migration 
    change_table :table_name do |t| 
     t.change :column_name, :data_type 
    end 
end 

và cuối cùng

rake db:migrate 
Các vấn đề liên quan