在rails中使用模型方法设置字段的默认值3
问题描述:
我有一个名为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>
答
after_initialize应该工作。请在初始化方法之后编写并检查输出。
after_initialize :set_last_taken
def set_last_taken
logger.debug("@@@@ - After initialize called")
end
请检查您的数据库列类型和attr_accessible该字段。
它似乎有效,当我通过网站,但不是当我使用irb时。 irb不会触发回调? – Finnjon 2014-10-12 05:18:49
是的,它也适用于回调。您可以将其记录在轨道控制台上查看输出。 – 2014-10-12 17:09:26