2011-08-26 26 views
38

Trong Rails 2, việc xóa một cột có di chuyển Rails cũng sẽ thay đổi/xóa chỉ mục được liên kết với cột không? Nếu không, và thay vào đó bạn cũng phải thay đổi/loại bỏ từng chỉ mục theo cách thủ công, thay vào đó nó có nên được tự động hóa không?Sẽ xóa cột có di chuyển Rails xóa chỉ mục được liên kết với cột

Cảm ơn (từ một newbie Rails)

+0

Bằng cách đây là một bài thú vị mà không nhất thiết phải trực tiếp trả lời câu hỏi của tôi tuy nhiên: http://keyj.wordpress.com/2009/05/28/remove-index-with-rails-migrations/ –

+4

Cập nhật: hiện tại, nó loại bỏ chỉ mục (Rails 4.1.7). –

Trả lời

24

Không, không may bạn phải gỡ bỏ các chỉ số bằng tay từ bên trong chuyển đổi của bạn bằng cách sử dụng phương pháp remove_index.

+6

cho MySQL 5.1 (ít nhất) điều này dường như không phải là trường hợp. Xem: http://stackoverflow.com/a/4341928/ – Tyler

+0

Cảm ơn bạn đã liên kết @Tyler –

+4

Trong Rails 4, hiện tại: http://stackoverflow.com/a/27622694/407213 (ví dụ: Tôi đã thử và sau đó) remove_column ... ',' remove_index ... 'ném" Tên chỉ mục '...' trên bảng '...' không tồn tại "<3) – Dorian

5

Để làm rõ, bên trong một chuyển đổi cú pháp để loại bỏ một chỉ số 2 cột như sau

remove_index :actions, :column => [:user_id,:action_name] 

hoặc theo tên, là một lựa chọn tồi tệ hơn từ quan điểm của tôi

remove_index :actions, :name => "index_actions_on_user_id_and_action_name" 
41

Từ Rails 4 trở lên, chỉ mục sẽ tự động xóa bằng cách xóa cột.

5

Cũng như cảnh báo, trong khi Rails 4 sẽ xóa chỉ mục cho bạn nếu bạn xóa cột, bạn nên chỉ định loại cột. Nếu không có loại cột, hãy chạy rake db:rollback sẽ trả về

rake aborted! 
StandardError: An error has occurred, all later migrations canceled: 

remove_column is only reversible if given a type. 

Tôi đã thử nghiệm với việc thả các cột khóa ngoài được lập chỉ mục. Ngay cả việc chỉ định index: true trong khối thay đổi dường như không làm cho các cột có thể đảo ngược khi khôi phục.

0

Trong Rails> 3.2.16, việc xóa cột sẽ xóa chỉ mục.

0

Nếu bạn muốn loại bỏ chỉ mục, bạn nên sử dụng remove_index, nếu bạn sử dụng remove_column nó sẽ loại bỏ chỉ mục nhưng bạn không thể chạy rake db: rollback. Như Jim đã đề cập.

remove_column is only reversible if given a type. 
Các vấn đề liên quan