В Rails: как изменение типа данных влияет на существующие данные?

Я работаю над приложением Rails и хотел бы изменить тип данных для существующего столбца. В настоящее время это тип DateTime, и я хочу изменить его на тип Date. Я нашел способ сделать это здесь, но в этом случае человека не беспокоили ранее существовавшие данные.

Прямо сейчас я планирую создать миграцию...

rails g migration change_my_column_in_my_talbe

... и внесите следующие изменения:

class ChangeMyColumnInMyTable < ActiveRecord::Migration
  def change
    change_column :my_table, :my_column, :date
  end
end

Мой вопрос: будут ли существующие данные преобразованы в тип Date или мне нужно будет создать задачу rake для преобразования значений для всех моих существующих значений DateTime?

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

Я использую Rails версии 4.2.0 и MySQL версии 5.6.27 Homebrew. Любые советы по этому вопросу будут очень признательны!


person tinezekis    schedule 02.03.2016    source источник


Ответы (2)


При использовании метода change_column преобразование данных будет выполняться конкретным адаптером базы данных, который вы используете. Например, с адаптером mysql change_column вызовет ALTER TABLE tbl_name MODIFY COLUMN col_name DATE. Преобразование данных из DATETIME в DATE приведет к сокращению времени.

Кроме того, MYSQL DATETIME to DATE выполняет округление, преобразование в значение DATE учитывает доли секунды и округляет время, «1999-12-31 23:59:59.499» становится «1999-12-31», тогда как «1999-12». -31 23:59:59.500» становится «2000-01-01». В любом случае метод change НЕ является обратимым для метода change_column.

http://guides.rubyonrails.org/active_record_migrations.html#using-the-change-method

Если вы планируете отменить эту миграцию, используйте вместо этого метод reversible.

person SacWebDeveloper    schedule 02.03.2016
comment
Я использую mysql; Я должен был включить это в свой первоначальный вопрос. Спасибо за это объяснение и за ссылку! - person tinezekis; 03.03.2016

change_column будет преобразовано в оператор ALTER TABLE ... ALTER COLUMN SQL, после чего обработка приведения зависит от вашей базы данных, поэтому полный ответ зависит от того, какую базу данных вы используете. Тем не менее, можно с уверенностью сказать, что ваша база данных может без проблем конвертировать дату и время в дату.

Тем не менее, нет лучшего способа узнать, чем проверить это!

person Robert Nubel    schedule 02.03.2016
comment
Я разработал способ проверить это, и все выглядело хорошо. Спасибо за вашу помощь! - person tinezekis; 04.03.2016