使用 CURRENT_TIMESTAMP 的 Rails 5.2 和 Active Record 迁移

2023-11-29

我有一些属性需要有默认值。我已经设置了迁移以在数据库中设置默认值,如下所示:

class AddDefaultsToModel < ActiveRecord::Migration[5.2]
  def change
    change_column :posts, :post_type, :string, default: 'draft'
    change_column :posts, :date_time, :datetime, default: -> { 'CURRENT_TIMESTAMP' }
  end
end

直接添加到数据库时,默认值效果很好。但是,如果我在 Rails 中构建一个新模型,一个属性会按预期工作,而另一个则不会:

post = Post.new
post.post_type # draft (as expected)
post.date_time # nil (expecting the current date and time)

这种行为是故意的吗?我是否也必须在模型中设置默认值?为什么Post#post_type工作但不工作Post#date_time?


ActiveRecord 不理解您的默认值date_time意味着它不给date_time根本没有默认值。然后,当您将该行插入数据库时​​(即post.save),数据库将使用当前时间戳作为date_time值(当然假设没有人接触过date_time)。 Rails 不会知道这一点date_time插入后有一个值,因此您会得到如下行为:

post = Post.new
post.date_time # `nil` because it hasn't been set at all
# set some other values on `post`...
post.save      # INSERT INTO posts (columns other than date_time...) values (...)
post.date_time # `nil` even thought there is a value in the database
post.reload    # Pull everything out of the database
post.date_time # Now we have a timestamp

您有一些选择:

  1. Call post.reload保存后post获取数据库使用的默认时间戳。

  2. Use an after_initialize自行设置默认值的钩子:

    class Post < ApplicationRecord
      after_initialize if: :new_record? do
        self.date_time = Time.now
      end
    end
    
  3. Use the 属性API手动设置默认值:

    class Post < ApplicationRecord
      attribute :date_time, :datetime, default: ->{ Time.now }
    end
    

    您需要使用 lambda(或 Proc),以便Time.now在正确的时间执行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 CURRENT_TIMESTAMP 的 Rails 5.2 和 Active Record 迁移 的相关文章

随机推荐

  • 如何使用谷歌应用程序脚本洗牌每隔一列?

    如果 C 是 4 我想使用 google apps 脚本随机化 D E F G H I J K At the moment I use this inefficient time consuming code function shuffl
  • 使用多个命令的 Python paramiko 模块

    我有一个创建连接的类 我可以在通道关闭之前连接并执行 1 个命令 在另一个系统上 我可以执行多个命令 并且通道不会关闭 显然 这是我尝试连接的系统的配置问题 class connect newconnection def init self
  • Linux下如何给进程分配更多内存

    我正在 64 位 Fedora 16 上使用 CAD 程序 有一次该程序突然崩溃并完全退出 我最初的猜测是没有足够的内存可供该程序执行该操作 并且它退出了 为了测试它 我想为该特定程序分配更多内存 这样做时 如果其他程序没有足够的内存 我也
  • 处理“大量”数据时的 WinForms UI 响应能力

    我正在修改一个 Windows 窗体 以允许在后台加载数据 同时 UI 保持响应 数据的检索和绑定都需要相当长的时间 理想情况下 我会在后台执行这两项操作 但是对于我应该在后台执行哪种 UI 更新 如在主线程之外 存在一些模糊性 一个在后台
  • C++ 中的字符串没有越界异常/错误吗? [复制]

    这个问题在这里已经有答案了 string p a cout lt
  • 从 asp.net core api 添加用户声明到 firebase auth

    给定一个 asp net core api 和仅使用 Authorize 属性的工作 firebase 身份验证 如何将自定义声明添加到令牌以使用 Authorize Policy admin 管理 SDK 仅适用于 Node js Jav
  • 创建一种通过网络发送整数的有效方法。传输控制协议

    如何将整数值转换为字节数组 然后通过字节流将它们发送到客户端程序 客户端程序将字节数组转换回整数 我的程序是乒乓球游戏 运行后 它会创建一个服务器 客户端使用对象流通过互联网连接到该服务器现在 一切都运转良好 但似乎效率不高 我的意思是 当
  • 如何检查 Javascript 数组中是否存在多个值

    所以 我正在使用 Jquery 并有两个具有多个值的数组 我想检查是否all第一个数组中的值存在于第二个数组中 例如 例1 数组 A 包含以下值 34 78 89 数组 B 包含以下值 78 67 34 99 56 89 这将返回true
  • 带有伪元素之前的 Z 索引

    我创建了一个带有 before pseudo 元素的 header 元素 伪元素必须位于父元素后面 一切都工作得很好 直到我给我的 标题 一个 z 索引 我想要的 前景中的黄色 标题 背景中的红色伪元素以及黄色 标题 元素上的简单 z 索引
  • 对 IText 7 中的所有 PDF 页面使用单一模板

    我有以下内容PDF模板这对于所有的应该是一致的pages添加到我正在创建的 PDF 中 问题是 我只得到这个模板Page 1仅适用于其余页面空白模板已使用 这是现在正在使用的代码 PdfDocument pdfDoc new PdfDocu
  • 在 Java 中对从数据库检索的一小部分数据执行连接操作。 (上下文:网络应用程序)

    在 Web 应用程序的上下文中 是否适合在 Java 中对从数据库检索的数据 从第一个查询 执行一些 JOIN 操作 并使用该 JOIN 数据进行第二个也是最后一个数据库查询以获得所需的数据 Java 是否为此类实现提供任何内置机制 或者实
  • Laravel 5.2 通过 API 进行身份验证

    我正在使用 Laravel 5 2 开发 RESTful API 在令牌守卫中位于 Illuminate Auth TokenGuard TokenGuard php在第 46 行 标记的列名称定义为api token this gt st
  • Selenium 测试在本地工作但在 Jenkins 中失败

    在工作中 我们为我们的一个应用程序提供了一个自动化套件 该套件设置为在每次提交到 master 部署到产品时运行 并且很长一段时间以来 我们一直在尝试使其足够可靠 测试在 Jenkins 中运行 使用 Selenium webDriver
  • 如何在 Android Canvas 上制作路径动画

    是否可以将动画师附加到路径上 还有其他方法可以在画布上绘制动画线条吗 我在发布之前搜索过此内容 但找不到任何内容 在另外两篇文章中在 Android 的 Canvas 上绘制路径作为动画 and 如何在 Android Canvas 上用动
  • 使用JS或Jquery读取css比例值

    我有这个div div div 我如何获得 transform scale x y 使用 JS 或 jQuery 的元素 id css transform 给我矩阵 但我需要元素的实际比例值 或者 如果我无法直接获得比例 那么将矩阵 转换为
  • Fortran 中不区分大小写的字符串比较

    尽管 Fortran 不区分大小写 但我观察到使用以下命令比较字符串时情况并非如此if查看 当然 用户应该意识到这一点 然而 Fortran 不区分大小写 我潜意识里希望同样适用于字符串检查 实现不区分大小写的字符串比较的有效方法是什么 这
  • ld 在 OSX Leopard 上找不到 X11 库

    我有一个在 Linux 上运行的非常基本的 X11 应用程序 我试图在 OSX 10 5 8 下编译它 我已经安装了X11和X11 SDK 并修改了makefile如下 CFLAGS L usr X11 lib I usr X11 incl
  • 如何从DataFrame中获取Array[Seq[String]]?

    如何通过DataFrame cc into Array Seq String val factors ccCols split val cc dataset select factors head factors tail 我尝试过这种方式
  • 扩展 Typescript 中的内置类型

    我有以下结构 project types global d ts string d ts wdio d ts src Models Resources Components Extensions string ts tsconfig jso
  • 使用 CURRENT_TIMESTAMP 的 Rails 5.2 和 Active Record 迁移

    我有一些属性需要有默认值 我已经设置了迁移以在数据库中设置默认值 如下所示 class AddDefaultsToModel lt ActiveRecord Migration 5 2 def change change column po