2013-10-05 61 views
1

問題是我有一個表類型爲date的表,但我只是使用年份。如何將它改爲整數類型以保持一年?我需要三步遷移嗎?我該如何回滾?Rails遷移:將列數據類型從日期更改爲整數

+0

將它作爲日期,但僅顯示年份。如果您不想打擾進入月份或日期,請使用1月1日。 –

+0

我同意@RobertHarvey,如果它真的仍然意味着某個日期的「年份」,我會放棄它。如果你真的想要一個整數,你可以在一次遷移中做所有事情,但回滾不能直接恢復你將要拋出的月份和日期信息。 – lurker

回答

2

我不同意其他海報:你最好不要存放一年爲一個整數,如果這是真的,你想捕捉的信息。因爲如果你不這樣做,並存儲一個完整的日期,那麼你實際上存儲的是一個虛假陳述的信息。也就是說,它存儲一個日期和一個月以及可能還有一些日曆元數據。每次使用它時,都需要牢記這一點,並確保任何計算都是您真正想要做的。也就是說,有許多日期和時間類和庫,都在使用中,都在Rails和Ruby中。

如果您只需要並且想要一年,那麼只需存儲一年。爲了達到這個目的,我會採用簡單而保守的方式:做幾個簡單的遷移。

  1. 添加新年欄。
  2. 轉換數據。
  3. 刪除舊年欄。
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 
+0

感謝您提供您的觀點和遷移代碼。很有用!我實際上只使用日期類型,並且只按照你所說的與年份一起工作,所以現在我要嘗試另一種方法。謝謝。 – hector

相關問題