2014-10-11 104 views
0

我有一個名爲Enrollments的表,我在該表上有一個名爲last_taken的列:datetime。我正在使用rails 3.2在rails中使用模型方法設置字段的默認值3

我對數據庫有一個約束,將此字段設置爲Time.now,但當然只需將默認設置爲遷移時間。我想要的是在模型中設置一個默認值。在這個網站上看到的解決方案似乎是一個回調,我已經嘗試了幾種形式。這就是目前沒有工作:

after_initialize :set_last_taken 

def set_last_taken 
    self.last_taken ||= Time.zone.now 
end 

無論哪個回調我使用(即before_create,before_save)我得到零值,當我創建控制檯領域不設置字段。控制檯總是顯示如下:

1.9.3p194 :052 > Enrollment.create(user_id: 22, course_id: 8) 
    (0.3ms) BEGIN 
    Enrollment Exists (0.7ms) SELECT 1 AS one FROM "enrollments" WHERE ("enrollments"."user_id" =  22 AND "enrollments"."course_id" = 8) LIMIT 1 
    SQL (1.1ms) INSERT INTO "enrollments" ("course_id", "created_at", "last_taken", "role", "updated_at", "user_id") VALUES ($1, $2, $3, $4, $5, $6) RETURNING "id" [["course_id", 8], ["created_at", Sat, 11 Oct 2014 14:56:53 EEST +03:00], ["last_taken", nil], ["role", "user"], ["updated_at", Sat, 11 Oct 2014 14:56:53 EEST +03:00], ["user_id", 22]] 
(0.8ms) COMMIT 
=> #<Enrollment id: 108, user_id: 22, course_id: 8, created_at: "2014-10-11 11:56:53", updated_at: "2014-10-11 11:56:53", role: "user", last_taken: nil> 

回答

1

after_initialize應該工作。請在初始化方法之後編寫並檢查輸出。

after_initialize :set_last_taken 

def set_last_taken 
    logger.debug("@@@@ - After initialize called") 
end 

請檢查您的數據庫列類型和attr_accessible該字段。

+0

它似乎有效,當我通過網站,但不是當我使用irb時。 irb不會觸發回調? – Finnjon 2014-10-12 05:18:49

+0

是的,它也適用於回調。您可以將其記錄在軌道控制檯上查看輸出。 – 2014-10-12 17:09:26

相關問題