2012-02-01 82 views
12

我有一列日期表:Rails的遷移設置當前日期作爲缺省值

create_table "test", :force => true do |t| 
    t.date "day" 
end 

我想設置當前日期作爲該列的默認值。 我嘗試如下:

create_table "test", :force => true do |t| 
    t.date "day", :default => Date.today 
end 

但默認情況下總是2月1日,所以如果我明天創造新的記錄,這一天仍然是2月1日(預計爲2月2日)

感謝響應!

注:我使用的軌道3

回答

22

Rails不支持動態遷移的默認值。 無論您的遷移在執行過程中會在數據庫級別設置,並保持這種狀態,直到遷移回滾,重寫或重置。但是,您可以輕鬆地在模型級別添加動態默認值,因爲它在運行時進行評估。使用after_initialize回調

class Test 
    def after_initialize 
    self.day ||= Date.today if new_record? 
    end 
end 

使用此方法僅當您需要初始化和後訪問屬性之前保存記錄

1)設置的默認值。此方法在加載查詢結果時會有額外的處理成本,因爲必須爲每個結果對象執行塊。使用before_create回調

class Test 
    before_create do 
    self.day = Date.today unless self.day 
    end 
end 

2)設置的默認值這個回調是由create呼叫模型觸發。 There are many more callbacks。例如,在驗證之前設置日期爲createupdate

class Test 
    before_validation on: [:create, :update] do 
    self.day = Date.today 
    end 
end 

3)使用default_value_for寶石

class Test 
    default_value_for :day do 
    Date.today 
    end 
end 
+0

非常感謝你,它的工作原理 – banhbaochay 2012-02-01 09:24:45

1

源碼不要以爲你能做到這一點的遷移。但是,Rails已經將created_at字段添加到了新模型遷移中,並且可以實現您想要的功能。如果你需要你自己的屬性做同樣的事情,只需使用before_save或before_validate來設置它,如果它是零。

3

剛剛完成哈里什謝蒂的答案。
對於Rails應用程序,您必須使用此語法:

class Test < ActiveRecord::Base 
    after_initialize do |test| 
     test.day ||= Date.today if new_record? 
    end 
    end 
相關問題