嗨!我是 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
用途,这样也能提供稍快一点的解决方案。
禁止指定 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 代码库做出贡献!
下周见!
订阅 以收到邮件更新。