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


227

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

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

Ответы:


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

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


2
Вы могли бы потенциально заботиться об использовании миграции в среде разработки, даже если вас не волнуют данные, если вы работаете в команде и хотите, чтобы изменение вашей схемы распространялось на всех других разработчиков в вашей команде.
— Хосе Б

У меня не получается увидеть, какое преимущество дает дополнительная миграция для изменения столбца в этой ситуации. Что не так с изменением исходной миграции, которая создала столбец? В любом случае каждый член команды должен повторно выполнить все миграции, чтобы получить новую схему.
— fakeleft

Если вы используете новую миграцию, вы можете просто отменить миграцию, которая изменила тип столбца. Если бы вам нужно было отредактировать оригинал, вам пришлось бы откатить это редактирование и повторно запустить миграцию после этого.
— Джазпи

На самом деле это очень разумный ответ, учитывая, что данных о производстве пока нет. Для тех, кто беспокоится о других членах команды, это то, что rake db:migrate:resetнужно.
— Райан Макгири,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.