Rails change_column с использованием функции Postgresql - время до целого числа (секунды с полуночи) - PullRequest
0 голосов
/ 29 апреля 2020

таблица orders имеет столбец cuts_off_at с типом данных time without time zone. Эта таблица и столбец использовались некоторое время, и, следовательно, таблица имеет много сохраненных записей. Я понял, что хотел бы, чтобы этот столбец имел тип данных integer для представления seconds since midnight. Как мне отформатировать строку change_column?

Я пробовал несколько разных вещей, но не могу понять, как это правильно. Я считаю, что это была моя ближайшая попытка:

change_column :orders, :cuts_off_at, 'INTEGER USING EXTRACT(epoch from ('2000-01-01 00:00:00'::time - cuts_off_at))'

, которая возвращает ошибку:

syntax error, unexpected tINTEGER, expecting end ...USING EXTRACT(epoch from ('2000-01-01 00:00:00'::time - cuts_...

версии:

postgres версия 10.12 рельсы 5.2.4.2

1 Ответ

1 голос
/ 29 апреля 2020

Подход с двумя миграциями не разрушителен и позволит вам использовать postgres magi c в прямом обновлении. Это также позволит вам убедиться, что все работает как положено ...

  def change
    rename_column :orders, :cuts_off_at, :cuts_off_at_old
    add_column :orders, :cuts_off_at, :integer
    execute("UPDATE orders SET cuts_off_at = EXTRACT(epoch from ('2000-01-01 00:00:00'::time - cuts_off_at_old))")
  end

Тогда вы можете просто удалить старый столбец в более поздней миграции ...

 def change
    remove_column :orders, :cuts_off_at_old
 end

Или если вы нужен подъем вниз ...

  def up
    rename_column :orders, :cuts_off_at, :cuts_off_at_old
    add_column :orders, :cuts_off_at, :integer
    execute("UPDATE orders SET cuts_off_at = EXTRACT(epoch from ('2000-01-01 00:00:00'::time - cuts_off_at_old))")
  end

  def down
    remove_column :orders, :cuts_off_at
    rename_column :orders, :cuts_off_at_old, :cuts_off_at
  end
...