Змініть тип стовпця з дати на дату часу під час міграції 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.