Изменить тип столбца с Date на DateTime во время миграции ROR

227

Мне нужно изменить тип столбца от даты к дате для приложения, которое я создаю. Меня не волнуют данные, так как они все еще разрабатываются.

Как я могу это сделать?

jdog
источник

Ответы:

508

Сначала в вашем терминале:

rails g migration change_date_format_in_my_table

Затем в вашем файле миграции:

Для Rails> = 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
apneadiving
источник
27
Вы правы, я просто предполагал, что новичок выберет новейшую доступную технологию, но это, конечно, неуверенно
аппендиус
12
Вопрос помечен как "ruby-on-rails-3"
Sucrenoir
2
@Sucrenoir Да, тег был добавлен после того, как он ответил.
Джейсон
10
Если вам интересно , почему один changeметод не используется вместо upи downметодов, это потому , что метод не поддерживает определение миграции . changechange_column
Деннис
2
Этот ответ является только частично правильным, вы не можете использовать change_column внутри изменения даже на рельсах 4, иначе миграция вниз не будет работать Вы должны использовать вверх / вниз независимо от версии рельсов.
Алан Пибоди
78

Кроме того , если вы используете Rails 3 или более новых вы не должны использовать upи downметоды. Вы можете просто использовать change:

class ChangeFormatInMyTable < ActiveRecord::Migration
  def change
    change_column :my_table, :my_column, :my_new_type
  end
end
Ли Макалли
источник
78
Метод change работает только с обратимыми миграциями. Приведенный выше код вызовет исключение ActiveRecord :: IrreversibleMigration. В методе изменения следует использовать только методы из api.rubyonrails.org/classes/ActiveRecord/Migration/… .
Давекаро
3
Я использую Rails 4 и ранее выполнял такую ​​миграцию. ИЗМЕНЕНИЕ НЕ РАБОТАЕТ! Комментарий @ davekaro правильный.
Гарри
3
Для Rails 5 это правильное и рабочее решение.
WM
3
Когда он перевернут, как он узнает, какой старый тип столбца должен измениться?
Эндрю Гримм
@AndrewGrimm ты прав. Вот что я вижу, когда пытаюсь изменить свою миграцию: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.
Марклар
42

В Rails 3.2 и Rails 4 популярный ответ Бенджамина имеет несколько иной синтаксис.

Сначала в вашем терминале:

$ rails g migration change_date_format_in_my_table

Затем в вашем файле миграции:

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
Томас Клемм
источник
23

Есть метод change_column , просто запустите его в вашей миграции с datetime в качестве нового типа.

change_column(:my_table, :my_column, :my_new_type)
Никита Рыбак
источник
1
сохраняет ли это исходные данные?
BKSpurgeon
1
Да, сохранить исходные данные
Mauro
1

AFAIK, миграции существуют, чтобы попытаться изменить данные, которые вас интересуют (например, производственные), при внесении изменений в схему. Так что, если это не так, и, поскольку он сказал, что ему нет дела до данных, почему бы просто не изменить тип столбца в исходной миграции с даты на дату и время и повторно запустить миграцию? (Надеюсь, у вас есть тесты :)).

fakeleft
источник
2
Вы могли бы потенциально заботиться об использовании миграции в среде разработки, даже если вас не волнуют данные, если вы работаете в команде и хотите, чтобы изменение вашей схемы распространялось на всех других разработчиков в вашей команде.
Хосе Б
У меня не получается увидеть, какое преимущество дает дополнительная миграция для изменения столбца в этой ситуации. Что не так с изменением исходной миграции, которая создала столбец? В любом случае каждый член команды должен повторно выполнить все миграции, чтобы получить новую схему.
fakeleft
Если вы используете новую миграцию, вы можете просто отменить миграцию, которая изменила тип столбца. Если бы вам нужно было отредактировать оригинал, вам пришлось бы откатить это редактирование и повторно запустить миграцию после этого.
Джазпи
На самом деле это очень разумный ответ, учитывая, что данных о производстве пока нет. Для тех, кто беспокоится о других членах команды, это то, что rake db:migrate:resetнужно.
Райан Макгири,