Migracja Rails do kolumny change

Mamy składnię script/generate migration add_fieldname_to_tablename fieldname:datatype do dodawania nowych kolumn do modelu.

W tej samej linii, czy mamy skrypt / generate do zmiany typu danych kolumny? A może powinienem napisać SQL bezpośrednio do mojej migracji vanilla?

Chcę zmienić kolumnę z datetime na date.

Author: Arslan Ali, 2010-05-10

7 answers

Myślę, że to powinno zadziałać.

change_column :table_name, :column_name, :date
 505
Author: Alex Korban,
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-02-07 05:53:28

Możesz również użyć bloku, jeśli masz wiele kolumn do zmiany w tabeli.

Przykład:

change_table :table_name do |t|
  t.change :column_name, :column_type, {options}
end

Zobacz dokumentację API na klasie Table aby uzyskać więcej szczegółów.

 95
Author: John,
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-03-30 08:40:25

Nie wiem, czy możesz utworzyć migrację z wiersza poleceń, aby to zrobić, ale możesz utworzyć nową migrację, a następnie edytować migrację, aby wykonać to taks.

Jeśli tablename jest nazwą Twojej tabeli, fieldname jest nazwą Twojego pola i chcesz zmienić czas z datetime na date, możesz napisać migrację w tym celu.

Możesz utworzyć nową migrację za pomocą:

rails g migration change_data_type_for_fieldname

Następnie Edytuj migrację, aby użyć change_table:

class ChangeDataTypeForFieldname < ActiveRecord::Migration
  def self.up
    change_table :tablename do |t|
      t.change :fieldname, :date
    end
  end
  def self.down
    change_table :tablename do |t|
      t.change :fieldname, :datetime
    end
  end
end

Następnie uruchom migracja:

rake db:migrate
 81
Author: Ryan,
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-01-11 20:20:17

Jak stwierdziłem w poprzednich odpowiedziach, potrzebne są trzy kroki, aby zmienić typ kolumny:

Krok 1:

Wygeneruj nowy plik migracji używając tego kodu:

rails g migration sample_name_change_column_type

Krok 2:

Przejdź do folderu /db/migrate i edytuj utworzony plik migracji. Istnieją dwa różne rozwiązania.

  1. def change
        change_column(:table_name, :column_name, :new_type)
    end
    

2.

    def up
        change_column :table_name, :column_name, :new_type
    end

    def down
        change_column :table_name, :column_name, :old_type
    end

Krok 3:

Nie zapomnij wykonać tego polecenia:

rake db:migrate

Testowałem to rozwiązanie dla Rails 4 i działa cóż.

 25
Author: Aboozar Rajabi,
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-04-07 05:41:21

Wystarczy wygenerować migrację:

rails g migration change_column_to_new_from_table_name

Zaktualizuj migrację tak:

class ClassName < ActiveRecord::Migration
    change_table :table_name do |t|
      t.change :column_name, :data_type
    end
end

I wreszcie

rake db:migrate
 6
Author: Vivek Sharma,
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-03-02 16:16:42

Z Szynami 5

Z Prowadnice Szyn :

Jeśli chcesz, aby migracja zrobiła coś, czego Active Record nie wie, jak odwrócić, możesz użyć reversible:

class ChangeTablenameFieldname < ActiveRecord::Migration[5.1]
  def change
    reversible do |dir|
      change_table :tablename do |t|
        dir.up   { t.change :fieldname, :date }
        dir.down { t.change :fieldname, :datetime }
      end
    end
  end
end
 4
Author: Mr. Tao,
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
2018-05-10 18:12:16

Inny sposób zmiany typu danych przy użyciu migracji

Krok 1: Należy usunąć nazwę pola faulowanego typu danych za pomocą migracji

Ex:

rails g migration RemoveFieldNameFromTableName field_name:data_type

Tutaj nie zapomnij podać typu danych dla Twojego pola

Krok 2: Teraz możesz dodać pole z prawidłowym typem danych

Ex:

rails g migration AddFieldNameToTableName field_name:data_type

To wszystko, teraz twoja tabela zostanie dodana z prawidłowym polem typu danych, Szczęśliwego kodowania ruby!!

 1
Author: prasanthrubyist,
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-10 12:32:45