2012-12-02 123 views
0

當我創建模型時,我編輯了一列:時間戳。遷移「列」:時間戳不起作用

t.timestamp :edited # in migration file 

預計,無論何時用戶在此模型中編輯任何內容,時間/日期都會更新。

但我只是看到,在數據庫架構它寫下來作爲

t.datetime "edited" 

,並預計用戶在表單中輸入的數據。

這裏發生了什麼?

如何更改我的遷移文件以在SQL DB中創建時間戳列?或者我應該在模型中分配它?

我不希望它依賴於用戶的輸入,必須是一個系統單元

THX。

回答

6

當您創建模型時,您應該生成一個ActiveRecord遷移來創建將存儲與此模型關聯的數據的表。例如,如果你的模型被稱爲「產品」,運行:

rails g migration create_products_table 

,這將產生一個數據庫遷移文件/遷移(前綴爲您生成遷移文件的時間戳,如:「20121201200720_create_products_table.rb 「)

遷移文件應該是這樣的:

class CreateProducts < ActiveRecord::Migration 
    def change 
    create_table :products do |t| 

     t.timestamps 
    end 
    end 
end 

當你運行這個遷移(rake db:migrate),ActiveRecord的會自動在你的表中創建兩列:created_atupdated_at。然後去看看你的schema.rb(在db中)。會有這樣的事情:

create_table "products", :force => true do |t| 
    t.datetime "created_at", :null => false 
    t.datetime "updated_at", :null => false 
end 

created_at將存儲在該產品創建的時間戳。 updated_at將存儲產品上次更新的時間戳(您在此處查找的內容)

因此,您不必創建自定義列,只需依賴ActiveRecord的內置時間戳。

+0

這麼容易..謝謝。我只是一個新手 - 不知道Rails可以爲我創建它們 – user1837021

1

Rails,更具體地說,ActiveRecord是數據庫不可知的。當考慮遷移應用程序或使用不同的數據庫,堆棧等來部署應用程序時,這非常棒。但是,它強加的一個限制是AR不支持任何特定於數據庫的功能。

AR列類型列表可以找到here。正如你所看到的,「timestamp」是一個AR列類型,但它更像是「datetime」類型的別名。

所以,如果你想在你的應用程序中使用SQL真正timestamp列,你可以做兩件事情之一:

  1. 您可以編輯遷移文件,並嘗試`噸。編輯「TIMESTAMP」(未測試但應該工作,因爲AR允許自定義類型作爲字符串)

  2. 您可以在數據庫中創建列並允許AR選取它。

如果你是新的軌道,那麼我會強烈建議使用Gullaume Galuz的回答,讓AR採取created_atupdated_at列的照顧。

如果不是,你也可以看看this question會清楚地說明需要使用DB專用的TIMESTAMP列。 (大小,速度,區域等)