使用rails 3中的model方法设置字段的默认值

时间:2014-10-11 12:14:00

标签: model callback ruby-on-rails-3.2 rails-activerecord

我有一个名为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> 

1 个答案:

答案 0 :(得分:1)

after_initialize应该有效。请在after initialize方法上写下并检查输出。

 after_initialize :set_last_taken

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

请检查此字段的数据库列类型和attr_accessible。