@artem_music

Как правильно осуществить миграцию столбца даты из строки в формат datetime?

Добрый день!
Есть объект в rails, у которого есть свойство "время завершения" (например, 24.03.2016 в 13:00 (МСК+2)). Хранится оно сейчас как string.

Как правильно настроить миграцию для базы данных, чтобы изменить формат столбца на datetime и обработать все существующие записи в БД?

Вот до чего я дошел:
class ChangeQueryDateColumn < ActiveRecord::Migration
  def up
    change_column :pages, :query_date, :datetime
  end
  
  def down
    change_column :pages, :query_date, :string
  end
end


Это сама миграция. Но главный затык в том, как изменить существующие уже записи?
Написал для этого регулярку, но не понимаю куда ее вставить в миграции:
Page.find(:all).each do |page|
  page.query_date = page.query_date.gsub(/\(.*/, '').to_datetime
  page.save!
end


Подскажете, как это сделать правильно? Заранее спасибо за ответ.
  • Вопрос задан
  • 220 просмотров
Решения вопроса 1
@vsuhachev
Вам нужно делать такую миграцию в 4 этапа:
  1. создаете колонку с типом datetime с временным имененм
  2. из колонки с типом string переносите данные в колонки с datetime
  3. удаляете колонку с типом string
  4. колонку с типом datetime переименовываете в нужное имя


И относительно вашего кода по переносу данных - так делать не рекомендуется потому что во-первых это крайне медленно, во вторых миграция зависит от класса. Представьте, через некоторое время вы доработаете класс(например переименуете аттрибут query_date) и ваша миграция перестанет работать т.к. она рассчитывает на то что код класса Page не поменялся, а он поменялся.

Для того чтобы миграции не зависели от кода классов и не отваливались со временем нужно писать их на SQL.

execute('update pages set new_query_date = STR_TO_DATE(query_date)')
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы