2009-05-20 24 views
185

Tôi có vấn đề, rằng tôi có một di cư trong Rails rằng thiết lập một thiết lập mặc định cho một cột, như ví dụ sau:Rails di cư: Hoàn tác thiết lập mặc định cho một cột

def self.up 
    add_column :column_name, :bought_at, :datetime, :default => Time.now 
end 

Giả sử, tôi thích thả cài đặt mặc định đó trong lần di chuyển sau, làm cách nào để thực hiện điều đó bằng cách sử dụng di chuyển đường ray?

workaround hiện tại của tôi là thực hiện một lệnh tùy chỉnh sql trong di chuyển đường ray, như thế này:

def self.up 
    execute 'alter table column_name alter bought_at drop default' 
end 

Nhưng tôi không thích cách tiếp cận này, bởi vì tôi bây giờ phụ thuộc vào cách thức cơ sở dữ liệu cơ bản là giải thích lệnh này. Trong trường hợp thay đổi cơ sở dữ liệu, truy vấn này có thể không hoạt động nữa và quá trình di chuyển sẽ bị hỏng. Vì vậy, có cách nào để thể hiện hoàn tác của một thiết lập mặc định cho một cột trong đường ray?

Trả lời

375

change_column_default(table_name, column_name, nil) còn có tác dụng giảm giá trị mặc định của cột hoàn toàn. Không cần sử dụng thực thi.

+7

Trong postgres, điều này sẽ không thực sự thả mặc định cho cột 'CHARACTER VARYING', chỉ cần đặt nó thành' NULL :: ký tự thay đổi '. –

+7

Trong các phiên bản gần đây, bạn có thể làm cho nó có thể đảo ngược. Ví dụ: 'change_column_default (: table_name,: column_name, from: nil, to: false)' – Mark

+1

@AttilaO. Tôi đã thành công khi chạy 'ALTER TABLE table_name ALTER COLUMN loại DROP DEFAULT', không cần thiết lập nó thành' NULL'. –

22

Sounds như bạn đang làm điều đúng với bạn 'thực hiện', như các tài liệu chỉ ra:

change_column_default(table_name, column_name, default) 

Thiết lập một giá trị mặc định mới cho một cột. Nếu bạn muốn đặt giá trị mặc định thành NULL, bạn đã hết may mắn. Bạn cần để DatabaseStatements # tự mình thực hiện câu lệnh SQL thích hợp . Ví dụ

change_column_default(:suppliers, :qualification, 'new') 
change_column_default(:accounts, :authorized, 1) 
+0

Cảm ơn! Tôi đã không tìm thấy gợi ý này trong tài liệu của bản thân mình! Hy vọng rằng chúng sẽ xây dựng trong việc giảm các giá trị mặc định thành di chuyển trong các phiên bản tương lai của đường ray. – wulfovitch

+1

Điều này không còn đúng như của Rails 3.1.0, cfr. http://apidock.com/rails/v3.1.0/ActiveRecord/ConnectionAdapters/SchemaStatements/change_column_default – asymmetric

14

Đoạn sau đây tôi sử dụng để làm cho NULL cột NOT NULL, nhưng bỏ qua DEFAULT ở cấp schema:

def self.up 
    change_column :table, :column, :string, :null => false, :default => "" 
    change_column_default(:table, :column, nil) 
end 
+0

Tôi không thấy giá trị gia tăng trong câu trả lời này vì câu trả lời được chấp nhận giống nhau. – Mosselman

+4

điều này thực sự là một trong đó đã giúp tôi nhất kể từ khi nó đã cho một ví dụ sử dụng ... – rogerdpack

-3

Rails 4

change_column :courses, :name, :string, limit: 100, null: false 
+10

Điều này thêm NOT NULL hạn chế, nó không có gì để làm với DEFAULT – Extrapolator

+0

không có gì để làm với DEFAULT +1 –

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