Jestem okropny w nazywaniu i zdaję sobie sprawę, że istnieje lepszy zestaw nazw dla moich modeli w mojej aplikacji Rails.
Czy istnieje sposób użycia migracji do zmiany nazwy modelu i odpowiadającej mu tabeli?Jak napisać migrację, aby zmienić nazwę modelu ActiveRecord i jego tabeli w Railsach?
Odpowiedz
Oto przykład:
class RenameOldTableToNewTable < ActiveRecord::Migration
def self.up
rename_table :old_table_name, :new_table_name
end
def self.down
rename_table :new_table_name, :old_table_name
end
end
musiałem iść i zmienić nazwę pliku Wzór deklaracji ręcznie.
Edit:
W Rails 3.1 & 4, ActiveRecord::Migration::CommandRecorder
wie, jak odwrócić rename_table migracje, więc można to zrobić:
class RenameOldTableToNewTable < ActiveRecord::Migration
def change
rename_table :old_table_name, :new_table_name
end
end
(tak musisz przejść i ręcznie zmienić nazwę pliki.)
Tak, ale to nie zmienia nazwy modelu, prawda? – ryeguy
zmienia tylko nazwę tabeli. –
Czy to oznacza, że musisz ręcznie zmienić nazwę kontrolera i wyświetlić foldery/pliki? Czy wszystkie te rzeczy należy ręcznie zmienić? – user5243421
Pozostałe odpowiedzi i komentarze dotyczyły zmiany nazwy tabeli, zmiany nazwy pliku i przeglądania kodu.
Chciałbym dodać jeszcze kilka Ostrzeżenia:
Użyjmy przykładu świecie rzeczywistym wychodził dzisiaj: „Biznesu” Zmiana nazwy modelu z „Kupca” do
- Nie zapomnij zmienić nazw tabel zależnych i modeli w tej samej migracji o . Zmieniłem modele Merchant i MerchantStat na Business i BusinessStat w tym samym czasie. W przeciwnym razie musiałbym zrobić zbyt dużo wyborów i wyborów podczas wykonywania wyszukiwania i zamiany.
- W przypadku innych modeli, które zależą od modelu za pomocą kluczy obcych, nazwy kolumn obcego klucza innych tabel będą pochodzić od pierwotnej nazwy modelu. Będziesz także chciał wykonać niektóre wywołania rename_column na tych zależnych modelach. Na przykład musiałem zmienić nazwę kolumny "merchant_id" na "business_id" w różnych tabelach łączenia (dla relacji has_and_belongs_to_many) i innych tabel zależnych (dla normalnych relacji has_one i has_many). W przeciwnym razie skończyłbym z kolumnami takimi jak "business_stat.merchant_id" wskazującymi na "business.id". Here's a good answer about doing column renames.
- Podczas przeglądania należy pamiętać o wyszukiwaniu pojedynczych, mnogich, wielkich i wielkich liter, małymi literami, a nawet WIELKIMI (które mogą występować w komentarzach) wersjami z twoich ciągów.
- Najlepiej najpierw wyszukiwać wersje w liczbie mnogiej, a następnie w liczbie pojedynczej. Ten numer , jeśli masz nieregularną liczbę mnogą - na przykład u moich sprzedawców: przykład dla firm - możesz poprawić wszystkie nieregularne liczby mnogiej. W przeciwnym razie może się zdarzyć, na przykład, "biznes" (3 s) jako stan pośredni , co spowoduje jeszcze więcej wyszukiwania i zamiany.
- Nie wymieniaj ślepo każdego wystąpienia. Jeśli nazwy Twoich modeli zderzają się z ze wspólnymi terminami programowania, wartościami w innych modelach lub z tekstem w swoich widokach, może okazać się, że zbyt często się nad tym zastanawiasz. W moim przykładzie chciałem zmienić nazwę mojego modelu na "Biznes", ale nadal nazywają je "kupcami" w treści w moim interfejsie użytkownika. Miałem także "handlową" rolę dla moich użytkowników w CanCan - było to pomieszanie między rolą handlowca a modelem handlowym, który spowodował, że zmieniłem nazwę modelu w pierwszej kolejności.
Należy również wymienić indeksów:
class RenameOldTableToNewTable< ActiveRecord:Migration
def self.up
remove_index :old_table_name, :column_name
rename_table :old_table_name, :new_table_name
add_index :new_table_name, :column_name
end
def self.down
remove_index :new_table_name, :column_name
rename_table :new_table_name, :old_table_name
add_index :old_table_name, :column_name
end
end
i zmieniać nazwy plików itp, ręcznie jak inne odpowiedzi tutaj opisać.
Patrz: http://api.rubyonrails.org/classes/ActiveRecord/Migration.html
Upewnij można cofnąć i toczyć do przodu po napisanie tej migracji. Może to być trudne, jeśli coś złego dzieje się i utknąć z migracją, która próbuje osiągnąć coś, co już nie istnieje. Najlepiej wyrzuć całą bazę danych i zacznij od nowa, jeśli nie możesz wycofać. Bądź więc świadomy, że możesz potrzebować poprzeć coś.
Również: sprawdź schemat_db dla wszystkich istotnych nazw kolumn w innych tabelach zdefiniowanych przez has_ lub belongs_to lub coś takiego. Prawdopodobnie będziesz również musiał je edytować.
I na koniec, zrobienie tego bez zestawu testów regresji byłoby szalone.
Jeśli chodzi o migracje 4.0.0.beta1 w wersjach railsowych, nie trzeba ręcznie aktualizować indeksów. AR sam go aktualizuje. – freemanoid
w szynach 4 wszystko, co musiałem zrobić, było def zmienić
def change
rename_table :old_table_name, :new_table_name
end
I wszystkich moich indeksów zostały załatwione dla mnie. Nie trzeba ręcznie aktualizować indeksów, usuwając stare i dodając nowe.
Działa również przy zmianie na wyższy lub niższy w odniesieniu do indeksów.
- 1. Jak zmienić nazwę modelu
- 2. Jak mogę przetłumaczyć nazwę atrybutu ActiveRecord w Railsach 3.2?
- 3. Jak zmienić nazwę tabeli w Cassandra CQL3
- 4. Jak zmienić nazwę kontrolera i modelu szyny w projekcie
- 5. Jak zmienić nazwę zmiennej wiersza w tabeli
- 6. Jak zmienić nazwę tabeli w SQLite 3.0?
- 7. SQL Server 2008: Skopiuj plik i zmienić jego nazwę
- 8. Jak zmienić położenie pliku wyjściowego kompilatora Nim i jego nazwę
- 9. Co to jest ct100 i jak mogę zmienić jego nazwę?
- 10. Jak dodać migrację z wieloma odniesieniami do tego samego modelu w jednej tabeli? Ruby/Rails
- 11. Jak utworzyć tableless ActiveRecord w Railsach 3
- 12. Czy można zmienić nazwę tabeli w Firebird?
- 13. Jak skopiować i zmienić nazwę kontenera Docker?
- 14. Kopiowanie wystąpień modelu w Railsach
- 15. Jak odkryć atrybuty modelu w Railsach
- 16. Jak uruchomić migrację bez uruchamiania transakcji w Railsach?
- 17. Jak zmienić nazwę pojedynczej kolumny w tabeli przy wyborze?
- 18. Dostęp do właściwości modelu w Railsach
- 19. Włączanie ActiveRecord :: Relacja do modelu
- 20. Nietrwałe atrybuty modelu ActiveRecord
- 21. Jak zmienić opcje w modelu Django?
- 22. Generowanie modelu ze stowarzyszeniami ActiveRecord
- 23. Belongs_to i has_and_belongs_to_many do tej samej tabeli w Railsach
- 24. Jak zmienić nazwę tabeli w SQL Server Compact Edition?
- 25. Jak zmienić nazwę tabeli w serwerze sql compact edition
- 26. Jak zmienić nazwę kolumny tabeli w Oracle 10g
- 27. Zrozumienie prostych aktualizacji ActiveRecord w Railsach
- 28. Jak zmienić nazwę indeksu w MySQL
- 29. Jak mogę zmienić nazwę metatagów "csrf-param" i "csrf-token" w Railsach 4?
- 30. Jak zmienić nazwę modułu Python?
Zasugerowałem dodanie "ActiveRecord" do tego pytania w celu ulepszenia wyszukiwarek. Szukałem tego przy użyciu "Tabeli zmian nazwy ActiveRecord". –
Jeśli używasz migracji, ten problem jest bardziej skomplikowany, niż się wydaje. Wybrane rozwiązanie mówi po prostu wrócić i ręcznie zmienić nazwę modelu, kontrolera itp. Po zmianie nazwy tabeli. Jeśli to zrobisz, wszystkie starsze migracje, które odnoszą się do Twojego modelu przez starszą nazwę, zawiodą. Więc kiedy ktoś sklonuje twoje repozytorium i spróbuje uruchomić 'rake db: migrate', to zawiedzie. Możesz wrócić i zmienić te imiona w migracji, ale to będzie kłopotliwe. Lepszym wyjściem jest stworzenie zupełnie nowego modelu, a nie zmiana jego nazwy. – andrew
@andrewhannigan: Czy nie ma sensu, jeśli ktoś sklonuje twoje repozytorium i po prostu uruchomi 'rake db: schema: load'? – istrasci