2012-02-15 23 views
95

Trong ứng dụng Rails (3.2) của tôi, tôi có một loạt các bảng trong cơ sở dữ liệu của mình nhưng tôi quên thêm một vài ràng buộc không phải rỗng. Tôi đã googled xung quanh nhưng tôi không thể tìm thấy làm thế nào để viết một di cư mà không thêm null vào một cột hiện có.Ruby on Rails: Làm cách nào để thêm một ràng buộc không null vào cột hiện tại bằng cách sử dụng di chuyển?

TIA.

Trả lời

78

Hãy thử change_column:

change_column :table_name, :column_name, :column_type, null: false 
+12

Hãy cẩn thận với cách tiếp cận này - nếu bạn có các thuộc tính khác về cột đó (ví dụ ràng buộc ': limit'), bạn cần lặp lại các thuộc tính đó khi sử dụng' change_column', hoặc chúng sẽ bị mất. Vì lý do này, tôi thích sử dụng 'change_column_null' –

+0

Lưu ý rằng điều này tạo ra một' IrreversibleMigration' mà có thể không phải là những gì bạn muốn. –

+0

@NicNilov bạn đang nói về câu trả lời HOẶC lời bình luận của Nathan Wallace? – Mark

184

Bạn cũng có thể sử dụng change_column_null:

change_column_null :table_name, :column_name, false 
+5

Câu trả lời rõ ràng nhất! –

+1

Tôi đã phải thay đổi nó cho một loạt các cột và điều này không yêu cầu xác định loại cột cho mỗi cột, tốt hơn nhiều! – Dorian

+3

Cũng hoạt động cho Rails 4+ – daniel

6

1) FIRST: Thêm cột với giá trị mặc định

2) THEN: Hủy bỏ giá trị mặc định

add_column :orders, :items, :integer, null: false, default: 0 
change_column :orders, :items, :integer, default: nil 
+0

đây là giải pháp đúng khi bạn cần thêm cột mới không phải là rỗng, trước tiên bạn cần xác định rằng nó có giá trị mặc định vì SQLLite sẽ khiếu nại (Không thể thêm cột NOT NULL với giá trị mặc định NULL), và sau đó loại bỏ nó! – Mil4n

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