2009-01-23 13 views
360

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?

+9

Zasugerowałem dodanie "ActiveRecord" do tego pytania w celu ulepszenia wyszukiwarek. Szukałem tego przy użyciu "Tabeli zmian nazwy ActiveRecord". –

+5

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

+4

@andrewhannigan: Czy nie ma sensu, jeśli ktoś sklonuje twoje repozytorium i po prostu uruchomi 'rake db: schema: load'? – istrasci

Odpowiedz

518

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.)

+0

Tak, ale to nie zmienia nazwy modelu, prawda? – ryeguy

+0

zmienia tylko nazwę tabeli. –

+0

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

39

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.
21

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.

+9

Jeśli chodzi o migracje 4.0.0.beta1 w wersjach railsowych, nie trzeba ręcznie aktualizować indeksów. AR sam go aktualizuje. – freemanoid

54

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.

Powiązane problemy