Cách thả cột bằng cách di chuyển Rails


Câu trả lời:


917
remove_column :table_name, :column_name

Ví dụ:

remove_column :users, :hobby

sẽ xóa Cột sở thích khỏi bảng người dùng.


9
Và đảm bảo thực hiện điều này bên trong updowncác phương thức, không change, như được giải thích trong câu trả lời của @Powers.
XåpplI'-I0llwlg'I -

7
@ XåpplI'-I0llwlg'I-Cảm ơn bạn đã bình luận. Phương pháp thay đổi có thể được sử dụng để thả một cột trong các ứng dụng Rails 4, nhưng không nên được sử dụng trong Rails 3. Tôi đã cập nhật câu trả lời của mình cho phù hợp.
Quyền hạn

9
Bạn cũng có thể sử dụng remove_column :table_name, :column_name, :type, :optionstrong changephương thức, vì nếu bạn chỉ định kiểu hoàn nguyên di chuyển là có thể. Từ tài liệu: Các tham số typeoptionssẽ bị bỏ qua nếu có. Có thể hữu ích khi cung cấp những thứ này trong changephương thức di chuyển để nó có thể được hoàn nguyên. Trong trường hợp đó, typeoptionssẽ được add_column sử dụng.
Nicolas

24
Trong Rails4, bạn có thể xóa một cột trong changephương thức, nhưng chỉ khi bạn chỉ định loại cột. Ví dụ remove_column, :table_name, :column_name, :column_type. Nếu không, bạn sẽ gặp phải lỗi sau khi thử chạy di chuyển:remove_column is only reversible if given a type
Dennis

5
Có thể đáng chú ý trong câu trả lời chính rằng việc xóa một cột không xóa chỉ mục tương ứng nếu nó tồn tại
cùng

371

Đối với các phiên bản cũ hơn của Rails

ruby script/generate migration RemoveFieldNameFromTableName field_name:datatype

Dành cho Rails 3 trở lên

rails generate migration RemoveFieldNameFromTableName field_name:datatype

18
"Đường ray g" có thể được sử dụng thay thế cho "đường ray tạo ra"
Noz

44
rails g migration remove_field_name_from_table_name field_name:datatypecũng hoạt động
Stuart Nelson

6
Cũng lưu ý rằng AddXXXtoTTTmột RemoveXXXFromTTTdanh sách có thể được theo sau bởi một danh sách fil_name: data_type có khoảng cách trắng và các câu lệnh add_column và remove_column thích hợp sẽ được tạo: rails g migration RemoveUnusefulFieldsFromUsers hair_color:string favorite_number:integerxóa hai thuộc tính bằng một lần di chuyển. Cũng lưu ý rằng remove_columnkhông được hỗ trợ bởi changephương thức, vì vậy bạn phải viết cả hai updown.
Claudio Floreani

3
Rails 4 dường như hỗ trợ changecho việc này. Rollback hoạt động như nó nên.
Unknown_Guy

2
@AdamGrant Tôi nghĩ rằng nếu bạn đang sử dụng một changephương thức có thể được hoàn nguyên * bạn sẽ cần thông báo cho loại dữ liệu (và tất cả các công cụ sửa đổi trường khác), vì vậy nếu bạn quay lại di chuyển đó, trường có thể được tạo lại chính xác. * Khi tôi nói hoàn nguyên, đó là về mặt cấu trúc cơ sở dữ liệu, tất nhiên, dữ liệu từ cột đó rõ ràng sẽ bị mất.
RFVoltolini

117

Rails 4 đã được cập nhật, vì vậy phương pháp thay đổi có thể được sử dụng trong quá trình di chuyển để thả một cột và quá trình di chuyển sẽ khôi phục thành công. Vui lòng đọc cảnh báo sau cho các ứng dụng Rails 3:

Cảnh báo đường ray 3

Xin lưu ý rằng khi bạn sử dụng lệnh này:

rails generate migration RemoveFieldNameFromTableName field_name:datatype

Di chuyển được tạo sẽ trông giống như thế này:

  def up
    remove_column :table_name, :field_name
  end

  def down
    add_column :table_name, :field_name, :datatype
  end

Đảm bảo không sử dụng phương thức thay đổi khi xóa các cột khỏi bảng cơ sở dữ liệu (ví dụ về những gì bạn không muốn trong tệp di chuyển trong ứng dụng Rails 3):

  def change
    remove_column :table_name, :field_name
  end

Phương thức thay đổi trong Rails 3 không thông minh khi nói đến remove_column, vì vậy bạn sẽ không thể quay lại quá trình di chuyển này.


3
sau đó chạy rake db: di chuyển
roxdurazo

1
@Powers - Câu trả lời tuyệt vời và rõ ràng - bạn có thể giải thích rõ hơn về vấn đề sau: "Phương pháp thay đổi trong Rails 3 không thông minh khi nói đến remove_column, vì vậy bạn sẽ không thể quay lại quá trình di chuyển này."
BKSpurgeon 22/03/2016

1
@BKSpurgeon - Trong Rails 3, nếu bạn sử dụng changephương thức, thì rake db:rollbacklệnh sẽ lỗi. rake db:rollbackvề cơ bản là ngược lại rake db:migrate. Lỗi này đã được sửa trong Rails 4 :)
Powers

2
Trong Rails 4, tôi đã cố gắng khôi phục một cột thả thay đổi. Nó không thành công và tuyên bố bạn phải chỉ định data_type (như trong mã xuống trong câu trả lời của bạn)
rmcsharry

1
Vấn đề tương tự xảy ra với tôi là @rmcsharry. Phiên bản rails của tôi là 4.2.2 và tôi đã sử dụng phương pháp thay đổi. Khi tôi cố gắng khôi phục, lỗi xảy ra rằng remove_column chỉ có thể đảo ngược nếu được cung cấp một loại.
M. Habib

38

Trong ứng dụng rails4, có thể sử dụng phương thức thay đổi để xóa các cột. Thông số thứ ba là data_type và trong tùy chọn tiếp theo bạn có thể đưa ra các tùy chọn. Đó là một chút ẩn trong phần 'Các biến đổi có sẵn' trên tài liệu .

class RemoveFieldFromTableName < ActiveRecord::Migration
  def change
    remove_column :table_name, :field_name, :data_type, {}
  end
end

27

Có hai cách tốt để làm điều này:

remove_column

Bạn chỉ có thể sử dụng remove_column, như vậy:

remove_column :users, :first_name

Điều này tốt nếu bạn chỉ cần thực hiện một thay đổi duy nhất cho lược đồ của mình.

khối thay đổi

Bạn cũng có thể thực hiện việc này bằng cách sử dụng khối Change_table, như vậy:

change_table :users do |t|
  t.remove :first_name
end

Tôi thích điều này vì tôi thấy nó dễ đọc hơn và bạn có thể thực hiện một vài thay đổi cùng một lúc.

Dưới đây là danh sách đầy đủ các phương thức change_table được hỗ trợ:

http://apidock.com/rails/ActiveRecord/ConnectionAd Chap / SchemaStatements / exchange_table


15

trong rails 5 bạn có thể sử dụng lệnh này trong terminal:

rails generate migration remove_COLUMNNAME_from_TABLENAME COLUMNNAME:DATATYPE

ví dụ để xóa cột access_level (chuỗi) khỏi người dùng bảng:

rails generate migration remove_access_level_from_users access_level:string

và sau đó chạy:

rake db:migrate

14

Tạo một di chuyển để loại bỏ một cột sao cho nếu nó được di chuyển ( rake db:migrate), nó sẽ bỏ cột . Và nó nên thêm cột trở lại nếu di chuyển này được khôi phục ( rake db:rollback).

Cú pháp:

remove_column: table_name ,: cột_name ,: loại

Xóa cột, cũng thêm cột trở lại nếu di chuyển được khôi phục.

Thí dụ:

remove_column :users, :last_name, :string

Lưu ý : Nếu bạn bỏ qua data_type , quá trình di chuyển sẽ xóa cột thành công nhưng nếu bạn quay lại quá trình di chuyển thì nó sẽ báo lỗi.


13

Hướng dẫn rõ ràng và đơn giản cho đường ray 5.2

  • CẢNH BÁO: Bạn sẽ mất dữ liệu nếu bạn xóa một cột khỏi cơ sở dữ liệu của bạn . Để tiếp tục, xem bên dưới:
  • Cảnh báo: các hướng dẫn dưới đây dành cho việc di chuyển tầm thường . Đối với các lần di chuyển phức tạp với hàng triệu và hàng triệu hàng, bạn sẽ phải tính đến khả năng thất bại, bạn cũng sẽ phải suy nghĩ về cách tối ưu hóa việc di chuyển của mình để chúng chạy nhanh và khả năng người dùng sẽ sử dụng ứng dụng của bạn trong khi quá trình di chuyển đang xảy ra. Nếu bạn có nhiều cơ sở dữ liệu, hoặc nếu có bất cứ điều gì phức tạp từ xa, thì đừng đổ lỗi cho tôi nếu có gì sai!

1. Tạo một di chuyển

Chạy lệnh sau trong thiết bị đầu cuối của bạn:

rails generate migration remove_fieldname_from_tablename fieldname:fieldtype

Lưu ý: tên bảng phải ở dạng số nhiều theo quy ước đường ray.

Thí dụ:

Trong trường hợp của tôi, tôi muốn xóa acceptedcột (giá trị boolean) khỏi quotesbảng:

rails g migration RemoveAcceptedFromQuotes accepted:boolean

Xem tài liệu lại: một quy ước khi thêm / xóa các trường vào bảng:

Có một lối tắt cú pháp đặc biệt để tạo các di chuyển thêm các trường vào bảng.

rails tạo di chuyển add_fieldname_to_tablename fieldname: fieldtype

2. Kiểm tra di chuyển

# db/migrate/20190122035000_remove_accepted_from_quotes.rb
class RemoveAcceptedFromQuotes < ActiveRecord::Migration[5.2]
  # with rails 5.2 you don't need to add a separate "up" and "down" method.
  def change
    remove_column :quotes, :accepted, :boolean
  end
end

3. Chạy di chuyển

rake db:migrate

.... Và sau đó bạn ra khỏi cuộc đua!


bây giờ di chuyển cũng có thể được chạy nhưrails db:migrate
Imran Ali

12

Xóa cột cho ứng dụng RAILS 5

rails g migration Remove<Anything>From<TableName> [columnName:type]

Lệnh trên tạo một tệp di chuyển trong db/migratethư mục. Đoạn trích là một trong những cột loại bỏ khỏi ví dụ bảng được tạo bởi trình tạo Rails,

class RemoveAgeFromUsers < ActiveRecord::Migration
  def up
    remove_column :users, :age
  end
  def down
    add_column :users, :age, :integer
  end
end

Tôi cũng đã làm một hướng dẫn tham khảo nhanh cho Rails có thể được tìm thấy ở đây .



10
rails g migration RemoveXColumnFromY column_name:data_type

X = tên cột
Y = tên bảng

BIÊN TẬP

Thay đổi RemoveXColumnToYđể RemoveXColumnFromYtheo ý kiến - cung cấp rõ ràng hơn đối với những gì mà di cư được thực sự làm.


3
"Remove cột để bảng" nghe có vẻ lạ, vì vậy từ dường như là sự lựa chọn tốt hơn ở đây.
Sebastian nôn Meer

@SebastianvomMeer vâng tôi đồng ý - Tiếng Anh đọc tốt hơn nhiều với 'từ'
BKSpurgeon 22/03/2016

8

Để xóa cột khỏi bảng, bạn phải chạy di chuyển sau:

rails g migration remove_column_name_from_table_name column_name:data_type

Sau đó chạy lệnh:

rake db:migrate

5

Đưa ra lệnh bên dưới, nó sẽ tự thêm vào tệp di chuyển

rails g migration RemoveColumnFromModel

Sau khi chạy lệnh trên, bạn có thể kiểm tra tệp di chuyển mã remove_column phải được thêm vào đó

Sau đó di chuyển db

rake db:migrate


5

Để xóa cột khỏi bảng chỉ trong 3 bước dễ dàng như sau:

  1. viết lệnh này

rails g migration remove_column_from_table_name

sau khi chạy lệnh này trong thiết bị đầu cuối, một tệp được tạo bởi tên và dấu thời gian này (remove_column from_table_name).

Sau đó vào tập tin này.

  1. bên trong tập tin bạn phải viết

    remove_column :table_name, :column_name

  2. Cuối cùng đi đến giao diện điều khiển và sau đó làm

    rake db:migrate


2

Đây là một trong những từ rails console

ActiveRecord::Migration.remove_column(:table_name, :column_name)


1

Thông qua
remove_column :table_name, :column_name
một tập tin di chuyển

Bạn có thể xóa một cột trực tiếp trong bảng điều khiển đường ray bằng cách gõ:
ActiveRecord::Base.remove_column :table_name, :column_name


1

Làm như thế này;

rails g migration RemoveColumnNameFromTables column_name:type

I E rails g migration RemoveTitleFromPosts title:string

Dù sao, sẽ tốt hơn để xem xét về thời gian chết cũng vì ActiveRecord lưu trữ các cột cơ sở dữ liệu trong thời gian chạy vì vậy nếu bạn thả một cột, nó có thể gây ra ngoại lệ cho đến khi ứng dụng của bạn khởi động lại.

Tham chiếu: Di cư mạnh mẽ


1

Đơn giản, bạn có thể xóa cột

remove_column :table_name, :column_name

Ví dụ,

remove_column :posts, :comment

1

đầu tiên hãy thử tạo một tệp di chuyển chạy lệnh:

rails g migration RemoveAgeFromUsers age:string

và sau đó trên thư mục gốc của dự án chạy di chuyển chạy lệnh:

rails db:migrate
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.