2011-01-29 46 views
224

Tôi có mô hình Người dùng cần cột :email (Tôi quên thêm cột đó trong khung ban đầu).Thêm cột vào bảng hiện có trong di chuyển Rails

Tôi đã mở tệp di chuyển và thêm t.string :email, đã làm rake db:migrate và nhận được NoMethodError. Sau đó, tôi đã thêm dòng

add_column :users, :email, :string 

lại rake db:migrate, lần nữa NoMethodError. Tôi có bỏ lỡ một bước ở đây không?

Chỉnh sửa: đây là tệp di chuyển.

class CreateUsers < ActiveRecord::Migration 
    def self.up 
    add_column :users, :email, :string 
    create_table :users do |t| 
     t.string :username 
     t.string :email 
     t.string :crypted_password 
     t.string :password_salt 
     t.string :persistence_token 

     t.timestamps 
    end 
    end 

    def self.down 
    drop_table :users 
    end 
end 

Trả lời

432

Nếu bạn đã chạy di chuyển ban đầu của mình (trước khi chỉnh sửa), thì bạn cần tạo một di chuyển mới (rails generate migration add_email_to_users email:string sẽ thực hiện thủ thuật). Sau đó, thực hiện rake db:migrate và nó sẽ chạy di chuyển mới.

Nếu bạn chưa chạy di chuyển ban đầu, bạn chỉ có thể chỉnh sửa nó, như bạn đang cố gắng làm. Mã di chuyển của bạn là hoàn toàn gần như hoàn hảo: bạn chỉ cần xóa hoàn toàn dòng add_column (mã đó đang cố thêm cột vào bảng, trước khi bảng được tạo và mã tạo bảng của bạn đã được cập nhật để bao gồm t.string :email anyway).

+4

đường ray g di chuyển addEmailĐối với người dùng cũng hoạt động – wheresmycookie

+3

Chỉ cần rõ ràng, chúng tôi sử dụng số nhiều? Vậy đó là 'add_email_to_users' và NOT' add_email_to_user'? – Purplejacket

+8

Chính xác. Tên bảng trong Rails luôn luôn là số nhiều (để phù hợp với quy ước DB). – camdez

3

Khi tôi đã thực hiện việc này, thay vì bỏ qua di chuyển ban đầu, tôi tạo một cột mới chỉ với cột thêm ở phần lên và cột thả ở phần dưới.

Bạn có thể thay đổi bản gốc và chạy lại nó nếu bạn di chuyển xuống giữa, nhưng trong trường hợp này tôi nghĩ rằng đó là việc di chuyển sẽ không hoạt động bình thường.

Như hiện được đăng, bạn đang thêm cột và sau đó tạo bảng.

Nếu bạn thay đổi thứ tự nó có thể hoạt động. Hoặc, khi bạn đang sửa đổi di chuyển hiện tại, chỉ cần thêm nó vào bảng tạo thay vì thực hiện một cột thêm riêng biệt.

21

Bạn cũng có thể làm

rake db:rollback

nếu bạn chưa thêm bất kỳ dữ liệu vào tables.Then chỉnh sửa các tập tin chuyển đổi bằng cách thêm cột email đến nó và sau đó gọi

rake db:migrate

Điều này sẽ hoạt động nếu bạn có đường ray 3.1 trở đi được cài đặt trong hệ thống của bạn.

Cách đơn giản hơn để thực hiện việc này là thay đổi cho phép thay đổi tệp di chuyển giống như vậy. sử dụng

$rake db:migrate:redo.

Thao tác này sẽ quay lại lần di chuyển cuối cùng và di chuyển lại.

76

Sử dụng lệnh này tại đường ray console rails generate migration add_fieldname_to_tablename fieldname:string

rake db:migrate để chạy di cư này

+0

cảm ơn mô tả lệnh. – zerocon

+1

Plus 1 vì tôi không bao giờ quản lý cú pháp để tạo di chuyển ... – Daniel

15

Để thêm một cột tôi chỉ phải làm theo các bước sau:

  1. rails generate migration add_fieldname_to_tablename fieldname:string

    Alternative

    rails generate migration addFieldnameToTablename

    Khi di cư được tạo ra, sau đó chỉnh sửa di cư và xác định tất cả các thuộc tính bạn muốn cột đó thêm vào có.

    Lưu ý: Tên bảng trong Rails luôn số nhiều (để khớp với quy ước DB). ví dụ sử dụng một trong những bước được đề cập previously-

    rails generate migration addEmailToUsers

  2. rake db:migrate

Hoặc

  1. Bạn có thể thay đổi lược đồ trong từ db/schema.rb, Thêm các cột bạn muốn trong truy vấn SQL.
  2. Chạy lệnh này: rake db:schema:load

    Cảnh báo/Note

    Gấu nhớ rằng, chạy rake db:schema:load tự động xóa tất cả dữ liệu trong bảng của bạn.

+0

Tôi đã làm điều này, nhưng nó không làm lại "giàn giáo" và thêm cột mới. Làm thế nào tôi có thể làm điều đó "tự động"? –

+0

@ John Wooten, bạn có thể muốn xóa Giàn giáo và xem lại nó. Thả di chuyển tương ứng. –

+0

để thêm ghi chú: thay đổi giản đồ mà không thay đổi quá trình di chuyển có thể tạo ra sự cố với các nhà phát triển khác đang duy trì ứng dụng. – BKSpurgeon

0

Bạn có thể rollback di chuyển gần nhất

rake db:rollback STEP=1 

hoặc rollback di cư cụ này bằng cách

rake db:migrate:down VERSION=<YYYYMMDDHHMMSS> 

và chỉnh sửa các tập tin, sau đó chạy rake db:mirgate một lần nữa.

1

Bạn cũng có thể buộc vào các cột bảng trong bảng sử dụng force: true, nếu bạn bảng đã tồn tại.

dụ:

ActiveRecord::Schema.define(version: 20080906171750) do 
    create_table "authors", force: true do |t| 
    t.string "name" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 
end 
1

Đôi khi rails generate migration add_email_to_users email:string tạo ra một di cư như thế này

class AddEmailToUsers < ActiveRecord::Migration[5.0] 
    def change 
    end 
end 

Trong trường hợp đó bạn phải tự thêm một dòng để change

class AddEmailToUsers < ActiveRecord::Migration[5.0] 
    def change 
    add_column :users, :email, :string 
    end 
end 

Và sau đó chạy rake db:migrate

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