Saya memiliki model Pengguna yang membutuhkan :email
kolom (saya lupa menambahkan kolom itu selama perancah awal).
Saya membuka file migrasi dan menambahkan t.string :email
, melakukan rake db:migrate
, dan mendapat NoMethodError
. Lalu saya menambahkan baris
add_column :users, :email, :string
lagi rake db:migrate
, lagi NoMethodError
. Apakah saya kehilangan langkah di sini?
Sunting: ini file migrasi.
class CreateUsers < ActiveRecord::Migration
def self.up
add_column :users, :email, :string
create_table :users do |t|
t.string :username
t.string :email
t.string :crypted_password
t.string :password_salt
t.string :persistence_token
t.timestamps
end
end
def self.down
drop_table :users
end
end
sumber
add_email_to_users
dan TIDAKadd_email_to_user
?rails db:migrate
untuk langkah terakhir.t.string :column_x, limit: 10, after: :column_y
(untuk Rails 4 setidaknya)Gunakan perintah ini di konsol rails
dan
untuk menjalankan migrasi ini
sumber
Terkadang
rails generate migration add_email_to_users email:string
menghasilkan migrasi seperti iniDalam hal ini Anda harus secara manual
add_column
kechange
:Dan kemudian jalankan
rake db:migrate
sumber
rails generate migration add_email_to_users email:string
ini dijalankan setelahbundle exec rails c
atau hanya di dalam terminal? 2) Di mana file yang dihasilkan ditempatkan setelah kami menjalankan query?Anda juga bisa melakukannya
jika Anda belum menambahkan data apa pun ke tabel. Kemudian edit file migrasi dengan menambahkan kolom email ke dalamnya lalu panggil
Ini akan berfungsi jika Anda memiliki rel 3.1 dan seterusnya diinstal di sistem Anda.
Cara yang lebih sederhana untuk melakukannya adalah mengubah biarkan perubahan dalam file migrasi apa adanya. menggunakan
Ini akan mengembalikan migrasi terakhir dan memigrasikannya kembali.
sumber
Untuk menambahkan kolom, saya hanya harus mengikuti langkah-langkah ini:
rails generate migration add_fieldname_to_tablename fieldname:string
Alternatif
rails generate migration addFieldnameToTablename
Setelah migrasi dibuat, kemudian edit migrasi dan tentukan semua atribut yang Anda inginkan untuk ditambahkan oleh kolom itu.
Catatan : Nama tabel dalam Rails selalu jamak (untuk mencocokkan konvensi DB). Contoh menggunakan salah satu langkah yang disebutkan sebelumnya-
rails generate migration addEmailToUsers
rake db:migrate
Atau
db/schema.rb
, Tambahkan kolom yang Anda inginkan dalam kueri SQL.Jalankan perintah ini:
rake db:schema:load
Peringatan / Catatan
Ingatlah bahwa, menjalankan
rake db:schema:load
secara otomatis menghapus semua data di tabel Anda.sumber
Ketika saya sudah melakukan ini, daripada mengutak-atik migrasi asli, saya membuat yang baru dengan hanya menambahkan kolom di bagian atas dan kolom drop di bagian bawah.
Anda dapat mengubah yang asli dan memutarnya kembali jika Anda bermigrasi di antaranya, tetapi dalam kasus ini saya pikir itu membuat migrasi yang tidak akan berfungsi dengan baik.
Saat ini diposting, Anda menambahkan kolom dan kemudian membuat tabel.
Jika Anda mengubah urutannya mungkin berhasil. Atau, saat Anda memodifikasi migrasi yang ada, tambahkan saja ke tabel buat alih-alih melakukan kolom tambahkan yang terpisah.
sumber
Anda juga bisa memaksa kolom tabel dalam tabel menggunakan
force: true
, jika tabel Anda sudah ada.contoh :
sumber
Anda juga dapat menggunakan metode change_table khusus dalam migrasi untuk menambahkan kolom baru:
sumber
Anda dapat mengembalikan migrasi terakhir dengan
atau kembalikan migrasi khusus ini oleh
dan edit file, lalu jalankan
rake db:mirgate
kembali.sumber
Anda juga dapat melakukan ini .. rels g migrasi add_column_to_users email: string
lalu rake db: migrasi juga tambahkan: atribut email di pengontrol pengguna Anda;
untuk detail lebih lanjut, lihat http://guides.rubyonrails.org/active_record_migrations.html
sumber
Anda juga dapat menambahkan kolom ke posisi tertentu menggunakan sebelum kolom atau setelah kolom seperti:
File migrasi akan menghasilkan kode berikut kecuali setelah:: email. Anda perlu menambahkan setelah:: email atau sebelum:: email
sumber