Menetapkan nilai default saat membuat file migrasi

104
rails generate migration AddRetweetsCountToTweet retweets_count:integer 

Ok saya menggunakan baris di atas untuk membuat file migrasi yang secara otomatis menghasilkan kode di file yang dihasilkan untuk menambahkan kolom ke model Tweet dengan datatype integer. Sekarang saya ingin menambahkan nilai default ke kolom yang ditambahkan saat membuat file migrasi. Apakah itu mungkin? Saya mencarinya di Google tetapi tidak dapat menemukannya. Cowok butuh bantuan.

kxhitiz.dll
sumber
lihat RailsGuide tentang subjek: Guideline.rubyonrails.org/migrations.html informasi yang Anda cari ada di bagian pertama Anatomi Migrasi
Austin Lin
1
Saya tahu persis apa yang Anda maksud. Saya terus mencoba menetapkan nilai default juga, dan itu agak merepotkan mencoba menemukan informasi. Membuat SQL telanjang saja lebih mudah, meskipun tidak ada migrasi dalam kontrol versi.
Tass

Jawaban:

166

Generator migrasi default tidak menangani nilai default ( pengubah kolom didukung tetapi tidak menyertakan defaultatau null), tetapi Anda dapat membuat generator sendiri.

Anda juga dapat memperbarui file migrasi secara manual sebelum menjalankan rake db:migratedengan menambahkan opsi ke add_column:

add_column :tweet, :retweets_count, :integer, :null => false, :default => 0

... dan baca Rails API

talas
sumber
9
Ok terima kasih atas jawabannya. Saya pikir akan sangat bagus jika generator migrasi default akan memberikan opsi untuk menangani nilai default sehingga saya tidak perlu mengedit file migrasi setelah dibuat untuk menentukan nilai default.
kxhitiz
9

Ya, saya juga tidak dapat melihat cara menggunakan 'default' dalam perintah generator migrasi, tetapi saya dapat menentukan nilai default untuk kolom string baru sebagai berikut dengan mengubah file migrasi yang dibuat sebelum menerapkan "rake db: migrate":

class AddColumnToWidgets < ActiveRecord::Migration
  def change
    add_column :widgets, :colour, :string, default: 'red'
  end
end

Ini menambahkan kolom baru bernama 'color' ke model 'Widget' saya dan menyetel 'warna' default widget baru menjadi 'merah'.

MSC
sumber
(Ini di Rails 4.2.)
MSC
4

Saya mencoba t.boolean: aktif,: default => 1 di file migrasi untuk membuat seluruh tabel. Setelah menjalankan migrasi itu ketika saya memeriksa db itu dibuat sebagai null. Meskipun saya mengatakan default sebagai "1". Setelah itu sedikit saya mengubah file migrasi seperti ini kemudian berfungsi untuk saya untuk mengatur nilai default pada membuat file migrasi tabel.

t.boolean: aktif,: null => false,: default => 1. Bekerja untuk saya.

Versi framework Rails saya adalah 4.0.0

Madhan Ayyasamy
sumber
:default => false?
Christopher Oezbek
2

Anda harus terlebih dahulu membuat migrasi Anda untuk dasar-dasar model, lalu Anda membuat migrasi lain untuk memodifikasi sebelumnya menggunakan change_column ...

def change
    change_column :widgets, :colour, :string, default: 'red'
end
Artur Pedrosa
sumber