Saya membuat kolom tanggal dalam migrasi sebelumnya dan menetapkannya sebagai nullable. Sekarang saya ingin mengubahnya menjadi tidak dapat dibatalkan. Bagaimana cara saya melakukan ini dengan asumsi ada baris nol dalam database itu? Saya baik-baik saja dengan mengatur kolom-kolom itu ke Time.now sekarang jika itu nol.
ruby-on-rails
migration
Kevin Pang
sumber
sumber
MyModel.update_all({:date_column => Time.now}, {:date_column => nil})
. Permintaan dalam bentuk asli Anda hanya membuat semua model saya memiliki nilai nol di bidang.change
Metode ini tidak begitu cocok untuk kasus ini karena (1)update_all
metode akan dieksekusi pada kedua bermigrasi dan revert potensial. Itu mungkin bukan yang terburuk tetapi karena (2) migrasi tidak memiliki cara untuk mengetahui dari mana kolom itu diubah dari potensi pemulihan. Jadi untuk kasus ini saya akan tetap denganup
dandown
.Di Rails 4, ini adalah solusi (PENGERING) yang lebih baik:
Untuk memastikan tidak ada catatan dengan
NULL
nilai di kolom itu, Anda bisa melewati parameter keempat, yang merupakan nilai default yang digunakan untuk catatan denganNULL
nilai:sumber
change_column_null
. Namun komentar Rick Smith di atas menunjukkan kasus yang sangat valid.Rails 4 (jawaban Rails 4 lainnya bermasalah):
Mengubah kolom dengan nilai NULL di dalamnya untuk tidak mengizinkan NULL akan menyebabkan masalah. Ini persis jenis kode yang akan berfungsi dengan baik dalam pengaturan pengembangan Anda dan kemudian macet ketika Anda mencoba untuk menyebarkannya ke produksi LIVE Anda . Anda harus terlebih dahulu mengubah nilai NULL menjadi sesuatu yang valid dan kemudian melarang NULL . Nilai 4 di
change_column_null
melakukan hal itu. Lihat dokumentasi untuk lebih jelasnya.Juga, saya umumnya lebih suka menetapkan nilai default untuk bidang sehingga saya tidak perlu menentukan nilai bidang setiap kali saya membuat objek baru. Saya menyertakan kode komentar untuk melakukannya juga.
sumber
add_column :users, :admin, :string
kemudianchange_column_null(:admin, :string, false, "new_value_for_existing_records")
Buat migrasi yang memiliki
change_column
pernyataan dengan:default =>
nilai.Lihat: change_column
Bergantung pada mesin basis data yang mungkin perlu Anda gunakan
change_column_null
sumber
change_column_null
.Rel 4:
sumber
Dalam Rails 4.02+ menurut dokumen tidak ada metode seperti
update_all
dengan 2 argumen. Sebagai gantinya, seseorang dapat menggunakan kode ini:sumber
Anda tidak dapat menggunakan add_timestamps dan null: false jika Anda memiliki catatan yang ada, jadi inilah solusinya:
sumber