【问题标题】:Rails: setting column default to created_at timestampRails:将列默认设置为 created_at 时间戳
【发布时间】:2014-10-27 16:19:05
【问题描述】:

我正在使用带有 Rails v4.1.6 的 Postgres DB

我有一张带有start_time 列的表格。

我希望start_time 列不为空,并且时间戳的默认值将是created_by 中的值。

我的理解是created_by(和updated_at)的时间戳值是由Rails 创建的,而不是由数据库强制执行的(如果这是错误的,请告诉我)。如果有办法匹配这两列?有没有办法让数据库强制执行它?

我现在唯一的解决方案是使用 before_create 过滤器(但我认为这两个值之间会存在不一致)。

【问题讨论】:

  • 您是否考虑过使用after_create 回调来更新start_time 属性,将其设置为等于created_at 值?
  • 我必须同意@Alireza 如何处理这种情况。强制执行数据库的方法是在模型中创建自定义创建方法,并在每次创建时调用该方法(这将更加困难),这将满足架构中的非空要求。
  • 您是否需要两列完全在同一时刻? start_time 以后会改变吗?
  • @Alireza 和 nikkon226 感谢您的回复。 after_create 可能是我最好的选择。因为保存流程中的操作顺序在保存之前进行了验证,有没有办法在 start_time 上进行验证?我的猜测不是。
  • @Substantial 我的目标是让它们完全相同

标签: ruby-on-rails postgresql timestamp default


【解决方案1】:

我要感谢 @Alireza 和 @nikkon226 对这个问题的看法。

我现在使用的解决方案是在 before_create 过滤器中修改 start_time。在 before_create 中(至少在 Rails v4.1.6 中)时间戳已经设置好了。在 before_create 中修改记录比在 after_create 中修改记录更好,因为它至少可以为我们节省 1 次保存调用。

当然,有了这个解决方案,我不再可以验证 start_time 的存在,因为验证发生在保存/创建之前。

如果有人有更好的解决方案,请分享。

【讨论】:

  • 很高兴知道时间戳已经在before_create回调中设置
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-06
  • 2015-10-12
  • 2011-07-17
  • 2016-12-18
  • 1970-01-01
相关资源
最近更新 更多