Inilah yang akan saya lakukan:
Buat migrasi untuk mengubah nama tabel (level database). Saya berasumsi meja lama Anda disebut korps . Konten migrasi akan menjadi:
class RenameCorpsToStores < ActiveRecord::Migration
def change
rename_table :corps, :stores
end
end
Ubah nama file model Anda, definisi kelas model Anda dan asosiasi model:
- Ganti nama file:
corp.rb
->store.rb
- Kode dari
store.rb
: Perubahan class Corp
untukclass Store
- Ubah nama semua asosiasi model seperti
has_many :corps
->has_many :stores
Ubah nama file pengontrol Anda dan definisi kelas pengontrol Anda:
- Ganti nama file:
corps_controller.rb
->stores_controller.rb
- Kode dari
stores_controller.rb
: Perubahan class CorpsController
untukclass StoresController
Ubah nama folder tampilan. Dari corps
hingga stores
.
Buat perubahan yang diperlukan di jalur dalam config/routes.rb
file, seperti resources :corps
-> resources :stores
, dan pastikan semua referensi dalam kode berubah dari corps ke toko (corps_path, ...)
Ingatlah untuk menjalankan migrasi :)
Jika sebelumnya tidak memungkinkan, coba hapus db / schema.rb dan jalankan:
$ rake db:drop db:create db:migrate
find -name "oldname_on_singular?*
untuk mendapatkan daftar file untuk diganti namanya. Lalu saya salin di calc, paste dua kali di kolom kedua dan ketiga. Pada kolom pertama saya tambahkan perintah rename dan pada kolom terakhir saya ganti dengan nama baru, kira-kira seperti:git mv ./spec/views/oldname ./spec/views/new name
rake db:drop
sangat berbahaya! Saya akan merekomendasikan Anda menghapus baris ini untuk mengubahnya menjadi "rake db: migrate"! Orang-orang memiliki kecenderungan untuk menyalin dan menjalankan!Selain jawaban Nobita, Anda juga perlu mengubah definisi kelas test & helper & nama file
corps
menjadistore
. Lebih penting lagi Anda harus mengubahcorps
kestore
dalam file config / routes.rb AndaJadi secara total Anda membuat perubahan pada file Controller, Model, Views, Helpers, Tests dan Routes terkait.
Saya pikir apa yang Anda lihat disarankan dengan
destroy
&generate
adalah pilihan yang lebih baik. Saya telah memberikan jawaban bagaimana melakukan ini di sini: Rails: mengganti nama pengontrol dan model yang sesuaisumber
Anda juga dapat mencoba permata Rails Refactor , alat baris Perintah untuk refaktor sederhana seperti mengganti nama model dan pengontrol untuk proyek Rails
Pemakaian:
sumber
Saya selain jawaban Nobita (yang akan saya komentari jika saya memiliki cukup reputasi), jika Anda merasa berani maka perubahan nama file dan referensi ke model dalam kode Anda dapat diotomatiskan. Misalnya, untuk mengubah referensi dalam kode Anda, Anda dapat menggunakan
Singular, minus dan mayus:
grep -rl corp | xargs sed -i 's/corp/store/g' grep -rl Corp | xargs sed -i 's/Corp/Store/g'
Jamak, minus, dan mayus (tunggal ganti jamak jika jamak hanya membutuhkan dan karakter s di akhir):
grep -rl corps | xargs sed -i 's/corps/stores/g' grep -rl Corps | xargs sed -i 's/Corps/Stores/g'
Ganti nama file:
find . -name '*corp*' -exec bash -c 'mv $0 ${0/corp/store}' {} \;
Dan ada utilitas bernama rename pada beberapa * nix flavours (termasuk Slackware) yang akan membantu Anda mengganti nama file:
shopt -s globstar rename -v corps stores app/**/*corps* config/**/*corps* test/**/*corps*
Periksa ganti nama adalah apa yang Anda pikirkan, saya telah mengetahui distribusi lain seperti Ubuntu untuk dikirimkan dengan utilitas berbeda dengan nama yang sama (lihat /unix/78621/find-rename-command- tidak bekerja ). Di Ubuntu Anda akan melakukan ini sebagai gantinya:
shopt -s globstar rename -v 's/corps/stores/' app/**/*corps* config/**/*corps* test/**/*corps*
Perhatikan bahwa Anda ingin menghindari mengganti nama file apa pun di db / kecuali mungkin di file seeds.rb Anda, jadi Anda mungkin ingin mengecualikan direktori ini dan membuat perubahan apa pun secara manual.
sumber
Satu hal penting lainnya adalah Anda perlu memperbarui asosiasi model, yang harus Anda lakukan apakah Anda mengganti nama secara manual atau menghancurkan dan menghasilkan sumber daya (karena ada di model lain). Anda dapat menjalankan migrasi untuk mengubah nama kolom dari kunci asing di database dan mengubah semua referensi ke kunci asing tersebut di kode:
rename_column :table, :old_id, :new_id
atau setel kunci asing khusus saat mendeklarasikan asosiasi yang menggunakan kunci asing lama:
belongs_to :new, foreign_key: "old_id"
Selain itu, jika sumber daya Anda menyertakan gambar, gambar tersebut sering kali disimpan dalam direktori yang menyertakan nama sumber daya tetapi (setidaknya dengan gelombang operator) setelah nama sumber daya diubah, mereka akan direferensikan dengan tidak benar (file ada di '/ uploads / old / image / 1 / pic.jpg 'tetapi dicari di' uploads / new / ... '), jadi Anda harus menghapus dan mengupload ulang gambar, memindahkannya ke jalur baru, atau mungkin mengubah tempatnya' sedang dicari.
sumber
Dan jika Anda memiliki uji model, Anda perlu mengubah:
Ganti nama file: corp_test.rb -> store_test.rb (juga untuk uji pengontrol, uji integrasi, fixture, dll.)
Kode store_test.rb: Ubah kelas CorpTest untuk kelas StoreTest.
Dan semua referensi corp di controller, model, integrasi, tes fixture.
sumber
Sebagai seseorang yang baru saja menyelesaikan proses yang menyakitkan ini, langkah PALING penting adalah membuat cukup TEST untuk memeriksa fungsionalitas sebanyak mungkin. Mereka harus mencakup tidak hanya model / pengontrol yang Anda rencanakan untuk diganti namanya tetapi juga semua bagian model / pengontrol / tampilan lainnya. Bagaimanapun itu adalah latihan yang baik (atau mungkin bahkan suatu keharusan).
Lakukan langkah-langkah ini dengan iterasi, terkadang Anda perlu kembali ke langkah beberapa kali (5 dan lebih banyak) untuk menemukan file tambahan yang perlu diubah. Dan sekarang untuk langkah ganti nama:
Corps/Corp
keStores/Store
dalamdb/migrate
folderCoba jalankan:
rake db: drop: semua
rake db: buat
rake db: bermigrasi
Ubah konten
db/seeds.rb
file.rake db:seed --trace
(Pada langkah ini Anda mungkin perlu mengubah beberapa file model / pengontrol lainnya.)test/fixtures
file. Anda mungkin perlu mengubah tidak hanya corps.yml tetapi file terkait lainnya (beberapa file mungkin menyertakan corp_id).TESTOPTS="--seed=1981"
atau nomor lain)sumber
untuk pengontrol Anda harus membuat perubahan di tempat-tempat berikut jika Anda melakukannya secara manual :
untuk model, jawaban Nobita lumayan bagus
sumber