Jawaban:
Inilah cara Anda harus melakukannya:
change_column :users, :admin, :boolean, :default => false
Tetapi beberapa database, seperti PostgreSQL, tidak akan memperbarui bidang untuk baris yang sebelumnya dibuat, jadi pastikan Anda memperbarui bidang manaully pada migrasi juga.
change_column_default :employees, :foreign, false
from:dan to:jika Anda ingin menjadi reversibel :)
fromdan toditambahkan dalam Rails 5+ dalam komit ini: github.com/rails/rails/pull/20018/files
Untuk Rails 4+ , gunakanchange_column_default
def change
change_column_default :table, :column, value
end
def change `add_column: foos,: name, default:" sesuatu untuk nilai yang ada "` `change_column_default: foos,: name, default:" "`end
change_column_default :products, :approved, from: true, to: false- tetapi tidak berfungsi juga.
Menggunakan def changeberarti Anda harus menulis migrasi yang dapat dibalik. Dan change_columntidak bisa dibalik. Anda dapat naik tetapi Anda tidak bisa turun, karena change_columntidak dapat dipulihkan.
Sebaliknya, meskipun mungkin beberapa baris tambahan, Anda harus menggunakan def updandef down
Jadi jika Anda memiliki kolom tanpa nilai default, maka Anda harus melakukan ini untuk menambahkan nilai default.
def up
change_column :users, :admin, :boolean, default: false
end
def down
change_column :users, :admin, :boolean, default: nil
end
Atau jika Anda ingin mengubah nilai default untuk kolom yang ada.
def up
change_column :users, :admin, :boolean, default: false
end
def down
change_column :users, :admin, :boolean, default: true
end
Pada Rails 4 Anda tidak dapat menghasilkan migrasi untuk menambahkan kolom ke tabel dengan nilai default, Langkah-langkah berikut menambahkan kolom baru ke tabel yang ada dengan nilai default benar atau salah.
$ rails generate migration add_columnname_to_tablename columnname:boolean
Perintah di atas akan menambahkan kolom baru di tabel Anda.
class AddColumnnameToTablename < ActiveRecord::Migration
def change
add_column :table_name, :column_name, :boolean, default: false
end
end
$ rake db:migrate
Menjalankan:
rails generate migration add_column_to_table column:boolean
Ini akan menghasilkan migrasi ini:
class AddColumnToTable < ActiveRecord::Migration
def change
add_column :table, :column, :boolean
end
end
Tetapkan nilai default menambahkan: default => 1
add_column: table,: column,: boolean,: default => 1
Lari:
rake db: bermigrasi
Key is not present in table error.
Inilah yang dapat Anda lakukan:
class Profile < ActiveRecord::Base
before_save :set_default_val
def set_default_val
self.send_updates = 'val' unless self.send_updates
end
end
EDIT: ... tapi ini kesalahan Rookie!
before_save
upblok dan bukan dichangeblok. Anda dapat membiarkandownblok kosong. Itu tidak akan mengembalikan tabel ke kondisi semula tetapi migrasi dapat dibatalkan.