2023 年 9 月 8 日,星期五

在具有复合主键模型的关联项上推断 primary_key: :id,为枚举添加验证选项,等等!

作者 vipulnsward

嗨!我是 Vipul,我来为您介绍本周 Rails 代码库中所做的最新变更。

在具有复合主键模型的关联项上推断 primary_key: :id

在此变更之前,需要执行以下操作才能建立复合主键模型的关联项

class Order
  self.primary_key = [:shop_id, :id]
  has_many :order_agreements, primary_key: :id
end

class OrderAgreement
  belongs_to :order, primary_key: :id
end

在此变更之后,无需再指定 primary_key 选项

class Order
  self.primary_key = [:shop_id, :id]
  has_many :order_agreements
end

class OrderAgreement
  belongs_to :order
end

enum 添加验证选项,使其可以在不产生错误的情况下进行验证

此变更会为枚举添加 :validate 选项。如果您想在保存之前对枚举值进行验证,请使用选项 :validate

class Conversation < ApplicationRecord
  enum :status, %i[active archived], validate: true
end

conversation = Conversation.new
conversation.status = :unknown
conversation.valid? # => false

还可以传递其他验证选项

class Conversation < ApplicationRecord
  enum :status, %i[active archived], validate: { allow_nil: true }
end

conversation = Conversation.new
conversation.status = nil
conversation.valid? # => true

否则,将产生 ArgumentError,这是当前的标准行为

class Conversation < ApplicationRecord
  enum :status, %i[active archived]
end

conversation = Conversation.new
conversation.status = :unknown # 'unknown' is not a valid status (ArgumentError)

在 Ruby 3.3 中针对 SecureRandom.base36/base58 使用 SecureRandom.alphanumeric

Ruby 3.3 添加了一项变更,允许 将一组字符传递至 SecureRandom.alphanumeric。此变更现在对 SecureRandom.base36/base58 使用 SecureRandom.alphanumeric,而不是用于复杂 SecureRandom.random_number/random_bytes 用途,这样也能提供稍快一点的解决方案。

已弃用将 rewhere 传递至 merge

禁止指定 Relation#merge(rewhere: true),因为自 Rails 7.0 起,该操作已成为默认操作。此变更将对 rewhere 选项的设置发出警告,该选项将在 Rails 7.2 中出错。

修复了当 where 使用三点范围时,unscope 不起作用的问题

此变更修复了在特定三点范围的情况下 unscope 不起作用的问题。例如

之前

Post.where(id: 1...3).unscope(where: :id).to_sql # "SELECT `posts`.* FROM `posts` WHERE `posts`.`id` >= 1 AND `posts`.`id` < 3"    

之后

Post.where(id: 1...3).unscope(where: :id).to_sql # "SELECT `posts`.* FROM `posts`"

修复了 change_column 在 sqlite 中未设置精度的问题

此变更修复了 change_column 在使用 7.0+ 迁移和 SQLite 时,未在 datetime 列上设置 precision: 6 的问题。

将 has_secure_token 的默认值更改为 on: :initialize

随着 此前所做的变更,可以配置 has_secure_token 声明,使其在 after_initialize 回调中执行。此提交添加了一项 Rails 7.1 默认值:当其对应模型初始化时,生成所有 has_secure_token 值。

修复:带有空白 wrapper_tag 选项的 simple_format 返回纯 html 标记

默认情况下 simple_format 方法返回的文本用 <p> 包装起来。但是,如果我们在选项中明确指定了 wrapper_tag: nil,它过去会使用 <></> 标签将文本包装起来。这个改变修复了行为,现在会用 <p> 取而代之。

您可以查看所有变更列表 在此 我们在上周有 30 名贡献者 为 Rails 代码库做出贡献!

下周见!

订阅 以收到邮件更新。