Oto, co bym zrobił:
Utwórz migrację, aby zmienić nazwę tabeli (poziom bazy danych). Zakładam, że twój stary stół nazywa się korpusem . Zawartość migracji będzie:
class RenameCorpsToStores < ActiveRecord::Migration
def change
rename_table :corps, :stores
end
end
Zmień nazwę pliku modelu, definicję klasy modelu i skojarzenia modelu:
- Zmiana nazwy pliku:
corp.rb
->store.rb
- Kod
store.rb
: Zmiana class Corp
dlaclass Store
- Zmień nazwę wszystkich skojarzeń modelu, na przykład
has_many :corps
->has_many :stores
Zmień nazwę pliku kontrolera i definicję klasy kontrolera:
- Zmiana nazwy pliku:
corps_controller.rb
->stores_controller.rb
- Kod
stores_controller.rb
: Zmiana class CorpsController
dlaclass StoresController
Zmień nazwy folderów widoków. Od corps
do stores
.
Wprowadź niezbędne zmiany w ścieżkach w config/routes.rb
pliku, takich jak resources :corps
-> resources :stores
, i upewnij się, że wszystkie odniesienia w kodzie zmieniają się z korpusu na sklepy (ścieżka_korpusu, ...)
Pamiętaj, aby przeprowadzić migrację :)
Jeśli poprzednie nie jest możliwe, spróbuj usunąć plik db / schema.rb i wykonaj:
$ rake db:drop db:create db:migrate
find -name "oldname_on_singular?*
aby uzyskać listę plików do zmiany nazwy. Następnie kopiuję go na kalk, wklejam dwa razy w drugiej i trzeciej kolumnie. W pierwszej kolumnie dodaję komendę rename a na ostatniej zmieniam na nową nazwę, coś w stylu:git mv ./spec/views/oldname ./spec/views/new name
rake db:drop
jest super niebezpieczny! Zalecałbym usunięcie tej linii, aby zmienić ją na „rake db: migrate”! Ludzie mają tendencję do kopiowania-wklejania i uruchamiania!Oprócz odpowiedzi Nobita, podobnie musisz zmienić definicje klas testowych i pomocniczych oraz nazwy plików dla
corps
nastore
. Co ważniejsze powinno zmienićcorps
sięstore
w config / routes.rb plikuW sumie więc wprowadzasz zmiany w kontrolerze, skojarzonym modelu, widokach, pomocnikach, testach i plikach tras.
Myślę, że to, co widziałeś, zasugerowało
destroy
igenerate
jest lepszą opcją. Podałem tutaj odpowiedź, jak to zrobić: Rails: zmiana nazwy kontrolera i odpowiedniego modeluźródło
Możesz także wypróbować klejnot Rails Refactor , narzędzie wiersza poleceń do prostych refaktorów, takich jak zmiana nazwy modelu i kontroler dla projektów Rails
Stosowanie:
źródło
Oprócz odpowiedzi Nobity (którą skomentowałbym, gdybym miał wystarczającą liczbę powtórzeń), jeśli czujesz się odważny, zmiany nazw plików i odniesień do modelu w twoim kodzie mogą być nieco zautomatyzowane. Na przykład, aby zmienić odwołania w swoim kodzie, możesz użyć
Liczba pojedyncza, minus i mayus:
grep -rl corp | xargs sed -i 's/corp/store/g' grep -rl Corp | xargs sed -i 's/Corp/Store/g'
Liczba mnoga, minus i majus (liczba pojedyncza zamień liczbę mnogą, jeśli liczba mnoga wymaga tylko i znaku na końcu):
grep -rl corps | xargs sed -i 's/corps/stores/g' grep -rl Corps | xargs sed -i 's/Corps/Stores/g'
Zmień nazwy plików:
find . -name '*corp*' -exec bash -c 'mv $0 ${0/corp/store}' {} \;
W niektórych wersjach * nix (w tym w Slackware) jest narzędzie o nazwie rename, które pomoże ci zmienić nazwy plików:
shopt -s globstar rename -v corps stores app/**/*corps* config/**/*corps* test/**/*corps*
Sprawdź, czy zmiana nazwy jest tym, czym myślisz, ale znam inne dystrybucje, takie jak Ubuntu, że są dostarczane z innym narzędziem o tej samej nazwie (patrz /unix/78621/find-rename-command- nie działa ). W systemie Ubuntu zrobiłbyś to zamiast tego:
shopt -s globstar rename -v 's/corps/stores/' app/**/*corps* config/**/*corps* test/**/*corps*
Zwróć uwagę, że chcesz uniknąć zmiany nazw plików w db / z wyjątkiem prawdopodobnie pliku seeds.rb, więc prawdopodobnie chcesz wykluczyć ten katalog i wprowadzić zmiany ręcznie.
źródło
Inną ważną rzeczą jest to, że musisz zaktualizować powiązania modelu, co musisz zrobić, niezależnie od tego, czy zmieniasz nazwę ręcznie, czy też niszczysz i generujesz zasób (ponieważ istnieją one w innych modelach). Możesz albo uruchomić migrację, aby zmienić nazwy kolumn kluczy obcych w bazie danych i zmienić wszystkie odniesienia do tych kluczy obcych w kodzie:
rename_column :table, :old_id, :new_id
lub ustaw niestandardowy klucz obcy podczas deklarowania asocjacji używającej starego klucza obcego:
belongs_to :new, foreign_key: "old_id"
Ponadto, jeśli zasób zawiera obrazy, często są one przechowywane w katalogu zawierającym nazwę zasobu, ale (przynajmniej z falą nośną), gdy nazwa zasobu zostanie zmieniona, będą się do nich odwoływać nieprawidłowo (plik istnieje w '/ uploads / old / image / 1 / pic.jpg ', ale jest szukany w' uploads / new / ... '), więc będziesz musiał albo usunąć i ponownie przesłać obrazy, przenieść je na nową ścieżkę lub może zmienić miejsce, w którym się znajdują' są szukani.
źródło
A jeśli masz testy modelowe, musisz zmienić:
Zmiana nazwy pliku: corp_test.rb -> store_test.rb (również do testów kontrolera, testów integracji, fixture itp.)
Kod store_test.rb: Zmień klasę CorpTest na klasę StoreTest.
I wszystkie referencje firmy w kontrolerze, modelu, integracji, testach urządzeń.
źródło
Dla kogoś, kto właśnie kończy ten bolesny proces, NAJWAŻNIEJSZYM krokiem jest zbudowanie wystarczającej liczby TESTÓW, aby sprawdzić jak najwięcej funkcjonalności. Powinny one obejmować nie tylko model / kontroler, którego nazwę planujesz zmienić, ale także wszystkie inne modele / kontrolery / widoki części. W każdym razie to dobra (a może wręcz obowiązkowa) praktyka.
Wykonuj te kroki iteracyjnie, czasami musisz wrócić do kroków kilka razy (5 i więcej), aby odkryć dodatkowe pliki, które należy zmienić. A teraz etapy zmiany nazwy:
Corps/Corp
sięStores/Store
wdb/migrate
folderzeSpróbuj biec:
rake db: drop: all
rake db: create
rake db: migracja
Zmień zawartość
db/seeds.rb
pliku.rake db:seed --trace
(w tym kroku może być konieczna zmiana innych plików modelu / kontrolera).test/fixtures
pliki. może zajść potrzeba zmiany nie tylko pliku corps.yml, ale także innych powiązanych plików (niektóre pliki mogą zawierać corp_id).TESTOPTS="--seed=1981"
lub dowolną inną liczbę)źródło
dla kontrolera będziesz musiał dokonać zmian w następujących miejscach, jeśli robisz to ręcznie :
jeśli chodzi o model, odpowiedź Nobity jest całkiem dobra
źródło