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?

Author: user2262149, 2009-01-23

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

 548
Author: Readonly,
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ż.

 60
Author: bfcoder,
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.
 43
Author: armchairdj,
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.
 23
Author: Rimian,
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