Jak napisać migrację, aby zmienić nazwę modelu ActiveRecord i jego tabeli w Rails?
Jestem okropny w nazywaniu i zdaję sobie sprawę, że istnieje lepszy zestaw nazw dla moich modeli w mojej aplikacji Rails.
Czy można użyć migracji do zmiany nazwy modelu i odpowiadającej mu tabeli?
4 answers
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 ręcznie zmienić nazwę pliku deklaracji modelu.
Edit:
W Rails 3.1 & 4, ActiveRecord::Migration::CommandRecorder
wie, jak odwrócić migrację rename_table, więc możesz to zrobić:
class RenameOldTableToNewTable < ActiveRecord::Migration
def change
rename_table :old_table_name, :new_table_name
end
end
(nadal musisz przejść i ręcznie zmienić nazwy plików.)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-17 07:01:58
W Rails 4 jedyne co musiałem zrobić to zmienić def
def change
rename_table :old_table_name, :new_table_name
end
I wszystkie moje indeksy zostały za mnie zadbane. Nie musiałem ręcznie aktualizować indeksów, usuwając stare i dodając nowe.
I działa za pomocą zmiany w górę lub w dół w odniesieniu do indeksów, jak również.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-17 01:27:55
Pozostałe odpowiedzi i komentarze obejmowały zmianę nazwy tabeli, zmianę nazwy pliku i przeszukiwanie kodu.
Chciałbym dodać jeszcze kilka zastrzeżeń:
Użyjmy prawdziwego przykładu, z którym się dzisiaj spotkałem: zmiana nazwy modelu z 'Merchant' na ' Business.'
- nie zapomnij zmienić nazw zależnych tabel i modeli w ta sama migracja. Zmieniłem moje modele Merchant i MerchantStat Na Business i BusinessStat w tym samym czasie. W przeciwnym razie też musiałbym to zrobić. dużo wybierania i wybierania podczas wykonywania wyszukiwania i wymiany.
- W przypadku innych modeli, które zależą od Twojego modelu za pomocą kluczy obcych, nazwy kolumn z kluczami obcymi innych tabel zostaną zaczerpnięte z oryginalnej nazwy modelu. Więc będziesz chciał również wykonać pewne 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 join (dla relacji has_and_belongs_to_many) i innych tabel zależnych (dla normalnych has_one i has_many). W przeciwnym razie skończyłbym z kolumnami typu ' business_stat.merchant_id "wskazując na "business.id'. oto dobra odpowiedź na temat zmiany nazw kolumn.
- podczas greppingu pamiętaj, aby szukać liczby pojedynczej, mnogiej, wielkiej litery, wersje z małymi, a nawet dużymi literami (które mogą występować w komentarzach) Twoich sznurków.
- najlepiej szukać najpierw wersji mnogiej, potem pojedynczej. Że sposób, jeśli masz nieregularną liczbę mnogą - np. w My merchants :: przykład firm - można uzyskać wszystkie nieregularne liczby mnogie poprawne. W przeciwnym razie możesz skończyć z ,na przykład, "Bizness" (3 s) jako stan pośredni, co skutkuje jeszcze większym wyszukiwaniem i zastępowaniem.
- nie zastępuj ślepo każdego zdarzenia. Jeśli nazwy modeli zderzają się z powszechnymi terminami programowymi, z wartościami w innych modelach lub z treści tekstowych w swoich poglądach, może skończyć się zbyt chętny. W moim przykładzie chciałem zmienić nazwę modelu na "biznes", ale nadal odnoszą się do oni jako "kupcy" w treści w moim interfejsie użytkownika. Miałem również rolę "handlowca" dla moich użytkowników w CanCan - to było zamieszanie między rolą handlowca a modelem handlowca, które spowodowało, że w pierwszej kolejności zmieniłem nazwę modelu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:39
Musisz również wymienić swoje indeksy:
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 zmienić nazwy plików itp, ręcznie, jak inne odpowiedzi tutaj opisują.
Zobacz: http://api.rubyonrails.org/classes/ActiveRecord/Migration.html
Upewnij się, że możesz cofnąć i przewijać do przodu Po napisaniu tej migracji. Może to być trudne, jeśli coś jest nie tak i utkniesz z migracją, która próbuje wpłynąć na coś, co już nie istnieje. Najlepiej wyczyścić całą bazę danych i zacząć od nowa, jeśli nie możesz cofnij się. Więc pamiętaj, że możesz potrzebować kopii zapasowej.
Również: Sprawdź schema_db dla odpowiednich nazw kolumn w innych tabelach zdefiniowanych przez has_ lub belongs_to lub coś w tym stylu. Prawdopodobnie będziesz musiał je również edytować.
I wreszcie, robienie tego bez zestawu testów regresyjnych byłoby szalone.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-05 22:24:04