1

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

4

2 回答 2

2

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

如果您只需要并且想要年份,则只存储年份。为了实现这一点,我会走简单而保守的路线:进行几次简单的迁移。

  1. 添加新年栏。
  2. 转换数据。
  3. 删除旧年份列。
于 2013-10-05T04:36:53.977 回答
2

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

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

IE

<%= 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
于 2013-10-05T04:27:20.097 回答