2013-10-05 5 views
1

Дело в том, что у меня есть таблица со столбцом даты типа, но я просто использую год. Как изменить его на целочисленный тип, чтобы сохранить только год? Мне нужна миграция из трех шагов? И как мне сделать откат?Rails migration: изменить тип данных столбца с даты на целое

+0

Оставьте это как дату, но просто укажите год. Если вы не хотите беспокоиться о вводе месяцев или дней, используйте 1 января. –

+0

Я согласен с @RobertHarvey, я бы оставил его, если он действительно все еще означает «год» даты. Вы могли бы сделать все за одну миграцию, если бы вы действительно хотели целое число, но откат не может напрямую восстановить информацию о месяце и день, которую вы выбрали. – lurker

ответ

2

Я не согласен с другими плакатами: вы лучше хранить год как целое число, если это действительно информация, которую вы хотите захватить. Потому что, если вы этого не сделаете, и сохраните полную дату, вы фактически храните часть информации, представляющую собой искажение. I.e., он хранит день и месяц и, возможно, некоторые метаданные календаря. Каждый раз, когда вы его используете, вам нужно помнить об этом, и убедитесь, что любые вычисления - это то, что вы действительно хотите делать. I.e., есть много классов и библиотек Date и Time, все в использовании, все в Rails и Ruby.

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

  1. Добавить колонку в новый год.
  2. Преобразование данных.
  3. Удалить столбец старого года.
2

Я согласен с некоторыми другими плакатами здесь, что вам, вероятно, лучше хранить его как значение даты и отображать только год. Для целей расчета, возможно, вы можете установить для всех значений даты в этом столбце значение 01-01-ГГГГ. Затем, когда вы хотите показать, что год на ваш взгляд, сделать:

#- my_date_value=Wed, 18 Sep 2013 19:21:11 UTC +00:00 
my_date_value.year 
=> 2013 

т.е.

<%= my_date_value.year %> 

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

class ChangeThingDateToYear < ActiveRecord::Migration 
    def change 
    add_column :things, :my_year_value, :integer 

    # You need to tell ActiveRecord to refresh the object 
    MyDatedThings.reset_column_information 
    MyDatedThings.all.each do |r| 
     r.my_year_value = r.my_date_value.year 
     r.save! 
    end 

    remove_column :things, :my_date_value 

    # If you want to keep the same column name 
    rename_column :things, :my_year_value, :my_date_value 
    end 
end 
+0

Спасибо, что указали свою точку зрения и код миграции. Очень полезно! Я на самом деле использую тип даты и работаю с частью года только, как вы сказали, поэтому я собираюсь попробовать другой подход. Благодарю. – hector

Смежные вопросы