我有一个名为Enrollments的表,我在该表上有一个名为last_taken:datetime的列。我正在使用rails 3.2
我对数据库有一个约束,要将此字段设置为Time.now,但当然只是将默认值设置为迁移时间。我想要的是在模型中设置默认值。在这个网站上看,解决方案似乎是一个回调,我已经尝试了几种形式。这是目前无效的:
after_initialize :set_last_taken
def set_last_taken
self.last_taken ||= Time.zone.now
end
无论我使用哪种回调(即before_create,before_save),当我在控制台中创建字段而不设置字段时,我得到的值为nil。控制台总是显示如下内容:
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>
答案 0 :(得分:1)
after_initialize应该有效。请在after initialize方法上写下并检查输出。
after_initialize :set_last_taken
def set_last_taken
logger.debug("@@@@ - After initialize called")
end
请检查此字段的数据库列类型和attr_accessible。