Rails迁移:将列数据类型从日期更改为整数

时间:2013-10-05 02:15:05

标签: ruby-on-rails migration

问题是我有一个日期类型的列表,但我只使用年份。如何将其更改为整数类型以保持年份?我需要三步迁移吗?我该如何进行回滚?

2 个答案:

答案 0 :(得分:2)

我同意这里的其他一些海报,你最好把它作为日期值保存,只显示年份。出于计算目的,您可以将该列中的所有日期值设置为01-01-YYYY。然后,当您想在视图中显示该年份时,请执行以下操作:

#- 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

答案 1 :(得分:2)

我不同意其他海报:如果真的是你要捕捉的信息,你最好将年份存储为整数。因为如果你没有,并存储一个完整的日期,那么你实际上存储的是一段虚假陈述的信息。即,它存储日期和月份以及可能的一些日历元数据。每次使用它时,您都需要记住这一点,并确保任何计算都是您真正想要做的。也就是说,有很多日期和时间类和库,都在使用中,都在Rails和Ruby中。

如果您只需要和想要年份,那么只存储一年。为实现这一目标,我将采用简单而保守的方式:进行几次简单的迁移。

  1. 添加新年列。
  2. 转换数据。
  3. 删除旧年专栏。