2023 年 6 月 23 日,星期五

Rails World 网站和售票、CPK 改进等等!

作者:gregmolnar

大家好,我是 Greg,将为您带来 Rails 代码库的最新改动。

Rails World 网站上线啦!
Rails World 会议网站今日上线。它由 Rails 社区的初级开发者 Shona Chan 创建。它由 Rails Foundation 委托,Katya Sitko 设计并在 Ayush Newatia 的指导下创建。

Rails World 门票今日开始出售!
Rails World 门票今日开始出售,6 月 23 日(星期五)欧洲中部时间下午 5 点开始,首批发售早鸟票。不要错过,阿姆斯特丹见!

修复 EncryptedConfiguration 无法像 Hash 一样运行的问题
之前,EncryptedConfiguration 使用 InheritableOptions,以便像方法一样调用键。后来对其做了更改,以确保它既像 Hash,又像 OrderedOptions 一样运行。此第二次更改意外中断了 #keys~#to_h 等方法,因此 Rails.application.credentials.to_h 返回了一个空哈希,即使设置了凭据也是如此。此请求修复了此问题,并且修复程序也 已移植到 7-0-stable

增加对使复合主键 has_one 关联无效的支持
创建此请求是因为 has_one 复合主键 (CPK) 与 dependent: :nullify 的关联已中断。它更改了 ActiveRecord::Associations::HasOneAssociation 中的无效化代码,以迭代遍历外键列,并在这些列不属于模型主键时将其无效化。

禁止在 Active Record 中将 *id* 作为枚举值
此更改禁止在 Active Record 中将 id 作为枚举值,因为它会导致意外的联接和子查询。如果你仍想使用它,可以使用已设置的 \_prefix\_suffix 选项。

更新 Action Text,使其在可用时使用 HTML5
此请求更新了 Action Text,使其在可用时使用 HTML5 清理器,并在可用时使用 Nokogiri::HTML5 解析标记。之前,Action Text 使用 Nokogiri 的 HTML4 解析器来进行这些操作。

不要对 Rails.application.config#inspect 显示 secret_key_base
调用 Rails.application.config#inspect 时,它展示了所有属性,包括 secret_key_base,此拉取请求覆盖 inspect 方法,仅展示类名称。此操作有助于避免意外输出敏感信息。对 MessageEncryptorEncryptedConfiguration 进行了相同改动

to_fs 中支持无起始和无终止范围
此拉取请求在 to_fs 中添加了对无起始/无终止范围的支持。它会像此例中所示的那样工作

> (0..1).to_fs(:db)
=> "BETWEEN '0' AND '1'"
> (..1).to_fs(:db)
=> "< '1'"
> (0..).to_fs(:db)
=> "> '0'"

错误修复:确保在 CPK 的一部分发生更改时保存 has_one 关联
如果 has_one 关联使用复合主键,并且复合主键的一部分在所有者上发生更改,则这些更改需要反映在所属对象的外键上。
以前此操作无法正常工作,因为 #_record_changed? 无法处理复合主键关联,因此我们无法识别所有者主键更改时需要更新所属对象的外键。

预加载复合主键模型
此拉取请求更改了连接依赖项分配,以正确处理具有复合主键的节点,从而修复了具有复合主键的预加载模型和关联。

自动保存 has_one 关联时使用 _read_attribute
此拉取请求修复了一个问题,即当关联主键设置为 :id 时,复合主键模型无法正确自动保存。在使用复合主键的模型中, #id 访问器将返回一个数组,而我们实际上想要的是 ID 列值。通过将 has_one 自动保存更改为使用 _read_attribute 而非 public_send,它将不会使用 #id 访问器。

将范围应用于关联子查询
此拉取请求确保将范围应用于关联(belongs_to/has_one/has_many)子查询。例如,如果您有此关联:has_many :welcome_posts, -> { where(title: "welcome") } 之前

Author.where(welcome_posts: Post.all)
#=> SELECT (...) WHERE "authors"."id" IN (SELECT "posts"."author_id" FROM "posts")
    ```
After:
```ruby
Author.where(welcome_posts: Post.all)
#=> SELECT (...) WHERE "authors"."id" IN (SELECT "posts"."author_id" FROM "posts" WHERE "posts"."title" = 'welcome')

您可以在 此处 查看整个变更列表。
本周有 21 位贡献者 为 Rails 代码库做出贡献!

下期再见!

订阅 以通过邮件接收这些更新。