Zmień typ kolumny z Date na DateTime podczas migracji ROR


Odpowiedzi:


508

Najpierw w twoim terminalu:

rails g migration change_date_format_in_my_table

Następnie w pliku migracji:

Dla szyn> = 3,2:

class ChangeDateFormatInMyTable < ActiveRecord::Migration
  def up
    change_column :my_table, :my_column, :datetime
  end

  def down
    change_column :my_table, :my_column, :date
  end
end

27
Masz rację, po prostu założyłem, że początkujący wybierze najnowszą dostępną technologię, ale to oczywiście nie jest pewne
apneadiving

12
Pytanie oznaczone jest jako „ruby-on-rails-3”
Sucrenoir,

2
@Sucrenoir Tak, tag został dodany przez nurkowanie po tym, jak odpowiedział.
Jason

10
Jeśli zastanawiasz się, dlaczego changenie zastosowano jednej metody zamiast metod upi down, to dlatego, że changemetoda nie obsługuje change_columndefinicji migracji .
Dennis

2
Ta odpowiedź jest tylko częściowo poprawna, nie możesz użyć zmiany_kolumny wewnątrz zmiany nawet na szynach 4 lub migracja w dół nie będzie działać. Powinieneś używać góra / dół bez względu na wersję szyn.
Alan Peabody

78

Ponadto, jeśli używasz Railsów 3 lub nowszych, nie musisz używać metod upi down. Możesz po prostu użyć change:

class ChangeFormatInMyTable < ActiveRecord::Migration
  def change
    change_column :my_table, :my_column, :my_new_type
  end
end

78
Metoda zmiany działa tylko z odwracalnymi migracjami. Powyższy kod zgłosiłby wyjątek ActiveRecord :: IrreversibleMigration. W metodzie zmiany należy stosować tylko metody z api.rubyonrails.org/classes/ActiveRecord/Migration/… .
davekaro

3
Korzystam z Rails 4 i wcześniej przeprowadzałem taką migrację. ZMIANA NIE DZIAŁA! Komentarz @ davekaro jest poprawny.
harryt

3
W przypadku Rails 5 jest to prawidłowe i działające rozwiązanie.
WM

3
W przypadku odwrócenia skąd miałby wiedzieć, na jaki stary typ kolumny powinien wrócić?
Andrew Grimm

@AndrewGrimm masz rację. Oto, co widzę, gdy próbuję cofnąć migrację:This migration uses change_column, which is not automatically reversible. To make the migration reversible you can either: 1. Define #up and #down methods in place of the #change method. 2. Use the #reversible method to define reversible behavior.
Marklar,

42

W Railsach 3.2 i Railsach 4 popularna odpowiedź Benjamina ma nieco inną składnię.

Najpierw w twoim terminalu:

$ rails g migration change_date_format_in_my_table

Następnie w pliku migracji:

class ChangeDateFormatInMyTable < ActiveRecord::Migration
  def up
   change_column :my_table, :my_column, :datetime
  end

  def down
   change_column :my_table, :my_column, :date
  end
end


1

AFAIK, migracje mają na celu przekształcenie danych, na których Ci zależy (tj. Produkcji) podczas wprowadzania zmian w schemacie. Więc jeśli nie jest to złe, a ponieważ powiedział, że nie dba o dane, dlaczego po prostu nie zmodyfikować typu kolumny w oryginalnej migracji z daty do daty i godziny i ponownie uruchomić migrację? (Mam nadzieję, że masz testy :)).


2
Możesz potencjalnie zainteresować się migracją w środowisku programistycznym, nawet jeśli nie dbasz o dane, jeśli pracujesz w zespole i chcesz, aby zmiana schematu rozprzestrzeniła się na wszystkich innych programistów w zespole.
Jose B

Mam problem z dostrzeżeniem korzyści, jakie daje dodatkowa migracja w celu zmiany kolumny w tej sytuacji. Co jest złego w zmianie oryginalnej migracji, która utworzyła kolumnę? W obu przypadkach każdy członek zespołu musi ponownie uruchomić wszystkie migracje, aby uzyskać nowy schemat.
fakeleft

Jeśli używasz nowej migracji, możesz po prostu cofnąć migrację, która zmieniła typ kolumny. Jeśli miałbyś edytować oryginał, musiałbyś cofnąć tę edycję i ponownie uruchomić migracje.
jazzpi

To właściwie bardzo rozważna odpowiedź, biorąc pod uwagę, że nie ma jeszcze danych produkcyjnych. Dla tych, którzy martwią się o innych członków zespołu, właśnie po to rake db:migrate:reset.
Ryan McGeary
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.