2024 年 3 月 29 日,星期五

重试已知的幂等 SELECT 查询、新增 Active Record 配置选项等!

作者:Emmanuel Hayford

问候!我是 Emmanuel Hayford,我来给大家带来本周的“Rails 中的本周”。我们直接开始吧。现在有两个新指南开始接受社区审阅。如果你精通 Action View、partial 和助手,请在此处审阅并提交你的反馈

添加 config.active_record.permanent_connection_checkout 设置
此设置决定了在访问 **ActiveRecord::Base.connection** 时执行的操作:引发错误、发出不赞成使用警告,还是不做任何操作。

**ActiveRecord::Base.connection** 从池中获取一个数据库连接,并一直保持到请求或任务结束。但是,这种行为在拥有比可用连接更多的线程或协程的环境中可能不合实际。

此配置有助于识别和消除利用 **ActiveRecord::Base.connection** 的代码,转而鼓励迁移到 **ActiveRecord::Base.with_connection** 。默认行为保持不变。

让 ActiveSupport::BacktraceCleaner 在 dup 上复制过滤器
增强 **ActiveSupport::BacktraceCleaner** 以在复制和克隆期间复制过滤器和静音器。

此前,复制仍然导致共享内部静音器和过滤器数组,从而导致状态泄漏。

确保必要选项已添加到关联选项
注意到 **:through** 中的拼写错误,请以以下代码示例为例

class User < ApplicationRecord
    has_many :courses
    has_many :assignments, trough: :courses
end

你将得到类似以下内容的误导性错误

“未知键::trough。有效键为::class_name, :anonymous_class, :primary_key, …, :index_errors (ArgumentError)”,

有了此拉取请求,你现在会得到更清晰的消息,更类似于

“未知键::trough。有效键为::class_name, :anonymous_class, :primary_key, …, :index_errors, :through (ArgumentError)”。

请注意,在第二个错误消息中,**:through** 包含在有效选项列表中。

在与连接相关的异常中重试已知的幂等 SELECT 查询
实施了一种机制,可在遇到与连接相关的异常时自动重试公认的幂等 **SELECT** 查询。

通过 Arel 树遍历或基于已知模型属性构建的查询本质上是幂等的,并且可以在遇到连接错误时安全重试。此前,某些适配器(如 TrilogyAdapter)在请求期间遇到连接错误时会引发 ActiveRecord::ConnectionFailed: Trilogy::EOFError 。

在过去的一周里,有 22 位贡献者 为 Rails 代码库做贡献!

保重。

来自Rails的有趣 commit、pull request 等周报。

订阅获取这些更新的邮件通知。