Змініть тип стовпця з дати на дату часу під час міграції ROR


227

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

Як я можу це зробити?

Відповіді:


508

Спочатку у своєму терміналі:

rails g migration change_date_format_in_my_table

Потім у вашому файлі міграції:

Для рейок> = 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
Питання позначено "rubin-on-rails-3"
Sucrenoir

2
@Sucrenoir Так, тег був доданий apneadiving після того, як він відповів.
Джейсон

10
Якщо вам цікаво, чому один changeметод не використовується замість методів upта downметодів, це тому, що changeметод не підтримує change_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
Метод зміни працює лише з оборотними міграціями. У наведеному вище коді буде виняток ActiveRecord :: IrreversibleMigration. У методі зміни слід використовувати лише методи api.rubyonrails.org/classes/ActiveRecord/Migration/… .
davekaro

3
Я запускаю Rails 4 і робив подібну міграцію раніше. Зміна не працює! @ davekaro коментар правильний.
harryt

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


1

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


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

У мене виникають проблеми з переглядом того, яку перевагу дає додаткова міграція для зміни стовпця у цій ситуації. Що не так із зміною оригінальної міграції, яка створила стовпець? У будь-якому випадку кожному члену команди доводиться повторювати всі міграції, щоб отримати нову схему.
підробка

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

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