2011-12-24 29 views
134

Tôi đã nhìn thấy một số câu hỏi (cụ thể là this one) ở đây về SO về việc thêm giá trị boolean mặc định vào cột hiện có. Vì vậy, tôi đã thử đề xuất change_column nhưng tôi không được làm đúng.Thêm: mặc định => true vào boolean trong cột Rails hiện có

tôi đã cố gắng:

$ change_column :profiles, :show_attribute, :boolean, :default => true 

nào trả -bash: change_column: command not found

sau đó tôi chạy:

$ rails g change_column :profiles, :show_attribute, :boolean, :default => true 

... và

$ rails change_column :profiles, :show_attribute, :boolean, :default => true 

Sau đó chạy rake db:migrate, b ut giá trị cho :show_attribute vẫn là nil. Trong câu hỏi tôi tham chiếu ở trên nó nói trong PostgreSQL bạn cần phải cập nhật nó bằng tay. Kể từ khi tôi đang sử dụng PostgreSQL tôi thêm những điều sau đây di cư create_profiles tôi:

t.boolean :show_attribute, :default => true 

một người nào đó có thể cho tôi biết những gì tôi đang làm sai ở đây?

Trả lời

283

change_column là phương thức ActiveRecord::Migration, vì vậy bạn không thể gọi nó như thế trong bảng điều khiển.

Nếu bạn muốn thêm một giá trị mặc định cho cột này, tạo ra một sự chuyển đổi mới:

rails g migration add_default_value_to_show_attribute

Sau đó, trong cuộc di cư tạo:

def up 
    change_column :profiles, :show_attribute, :boolean, default: true 
end 

def down 
    change_column :profiles, :show_attribute, :boolean, default: nil 
end 

Sau đó chạy rake db:migrate.

Nó sẽ không thay đổi bất kỳ điều gì đối với các bản ghi đã tạo. Để làm điều đó, bạn sẽ phải tạo một rake task hoặc chỉ cần đi vào số rails console và cập nhật tất cả các bản ghi.

Khi bạn thêm t.boolean :show_attribute, :default => true vào di chuyển create_profiles, điều đó là bình thường nếu nó không làm gì cả. Chỉ những lần di chuyển chưa được chạy mới được thực hiện. Nếu bạn bắt đầu với một cơ sở dữ liệu mới, thì nó sẽ đặt mặc định là true.

+2

Đó gọi change_column nên trong 'phương pháp up' trong di chuyển, mà là một lớp mới mà sẽ được tạo trong db/migrate /. (Phương thức 'down' phải được viết để hoàn tác những gì' up' làm.) Thực hiện thay đổi đó, sau đó 'rake db: migrate'. – rkb

+0

Ahh, điều đó có ý nghĩa rkb hơn. Cảm ơn! – tvalent2

+0

nó đã không làm việc cho tôi cho đến khi tôi đã viết 'def self.up' và' def self.down' –

85

Là một biến thể của câu trả lời chấp nhận bạn cũng có thể sử dụng phương pháp change_column_default trong cuộc di cư của bạn:

def up 
    change_column_default :profiles, :show_attribute, true 
end 

def down 
    change_column_default :profiles, :show_attribute, nil 
end 

Rails API-docs

+1

Điều này đảm bảo bạn sẽ không vô tình thay đổi bất kỳ thuộc tính cột nào khác –

+0

Và trong Rails 5, bạn thoát khỏi _attribute để nó chỉ nên nói 'show' hoặc bất kỳ tên cột nào. – labyrinth

21

Tôi không chắc chắn khi điều này đã được viết, nhưng hiện tại để thêm hoặc xóa mặc định từ cột trong quá trình di chuyển, bạn có thể sử dụng các mục sau:

change_column_null :products, :name, false 

Rails 5:

change_column_default :products, :approved, from: true, to: false 

http://edgeguides.rubyonrails.org/active_record_migrations.html#changing-columns

Rails 4.2:

change_column_default :products, :approved, false 

http://guides.rubyonrails.org/v4.2/active_record_migrations.html#changing-columns

Đó là một cách gọn gàng để tránh nhìn qua di cư hoặc giản đồ của bạn cho các thông số kỹ thuật cột.

+0

Hãy coi chừng, đó là tài liệu từ Rails 5. Phiên bản Rails 4.2 của điều này không chấp nhận băm nhưng chính xác mặc định mới là tham số thứ ba. http://guides.rubyonrails.org/v4.2/active_record_migrations.html#changing-columns – Clamoris

+0

Giới thiệu về Rails 5, làm cho cả hai dường như là cách chính xác nhất, ví dụ: 'null: false' và' default:: something' về cơ bản – Dorian

0
change_column :things, :price_1, :integer, default: 123, null: false 

Dường như là cách tốt nhất để thêm mặc định vào cột hiện tại chưa có null: false rồi.

Nếu không:

change_column :things, :price_1, :integer, default: 123 

Một số nghiên cứu tôi đã làm về vấn đề này:

https://gist.github.com/Dorian/417b9a0e1a4e09a558c39345d50c8c3b

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