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

213

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

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

Теги:
migration
ruby-on-rails-3

5 ответов

463
Лучший ответ

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

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"
Показать ещё 8 комментариев
74

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

class ChangeFormatInMyTable < ActiveRecord::Migration
  def change
    change_column :my_table, :my_column, :my_new_type
  end
end
  • 77
    Метод change работает только с обратимыми миграциями. Приведенный выше код будет вызывать исключение ActiveRecord :: IrreversibleMigration. Только методы из api.rubyonrails.org/classes/ActiveRecord/Migration/… должны использоваться в методе изменения.
  • 3
    Я использую Rails 4 и ранее выполнял такую миграцию. ИЗМЕНЕНИЕ НЕ РАБОТАЕТ! Комментарий @ davekaro правильный.
Показать ещё 3 комментария
39

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

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

$ 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
  • 2
    Это должен быть правильный ответ.
22

Там есть метод change_column, просто выполните его при переносе с datetime как новый тип.

change_column(:my_table, :my_column, :my_new_type)
  • 0
    сохраняет ли это исходные данные?
2

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню