ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Ruby on Rails 6.1 发布说明详解:分库连接切换、水平分片、严格加载等五大特性与完整变更清单

Ruby on Rails 6.1 发布说明详解:分库连接切换、水平分片、严格加载等五大特性与完整变更清单 Ruby on Rails 6.1 发布说明详解分库连接切换、水平分片、严格加载等五大特性与完整变更清单【免费下载链接】railsRuby on Rails项目地址: https://gitcode.com/GitHub_Trending/rai/rails本文基于 Rails 仓库中 6.1 版本发布说明 完整展开先讲清楚 6.1 的五个重大特性Per-database Connection Switching、Horizontal Sharding、Strict Loading、Delegated Types、Destroy Associations Async再逐框架列出移除项、弃用项与显著变更并结合当前仓库源码印证这些特性的落地实现帮助升级者评估迁移影响并掌握各特性的实际用法。版本定位与升级前置建议Rails 6.1 发布说明明确声明这些发布说明只覆盖重大变更各类 bug 修复请查阅各框架的 Changelog本仓库中各框架目录下均有如 Active Record Changelog、Action Pack Changelog 等。关于升级路径官方给出三点建议动手前先确保应用有良好的测试覆盖率如果还没升级到 Rails 6.0应先升级到 6.0 并确认应用行为正常再尝试 6.1升级时的完整注意事项清单见 Upgrading Ruby on Rails 指南。五大重大特性1. Per-database Connection Switching按库切换连接Rails 6.0 中如果切换到reading角色所有数据库连接都会一起切换到 reading 角色无法做到只切换某一个数据库的连接。Rails 6.1 引入了更细粒度的控制在配置中将legacy_connection_handling设为false后可以在对应的 abstract class如某个Base子类上调用connected_to仅切换该数据库的连接而不影响其他库。从当前仓库源码可以看到该能力的接口形态connection_handling.rb 中定义了按role与shard两个维度切换的类方法def connected_to(role: nil, shard: nil, prevent_writes: role ActiveRecord.reading_role, blk)以及配套的connected_to_many跨多个 class 同时切换、connected_to_all_shards切换所有 shard 的连接和connected_to?查询方法。发布说明特别指出要使用新的按库连接处理方式应用必须把legacy_connection_handling改为false并移除connection_handlers上的已弃用访问器connects_to与connected_to的公开用法本身无需改动。2. Horizontal Sharding水平分片Rails 6.0 支持的是功能分区functional partitioning多个分区、不同的 schema。而水平分片要求同一 schema、多个分区——这在 6.0 中做不到因为 Active Record 的模型每个 class 每个 role 只能有一个连接。6.1 修复了这一限制使基于 shard 的水平分片成为可能对应的正是上面connected_to(role:, shard:)接口中的shard:参数。3. Strict Loading Associations严格加载关联严格加载允许你强制关联必须被预加载把 N1 查询扼杀在发生之前。用法是在关联上声明strict_loading: true。从源码可以确认其完整实现链路关联构建器把:strict_loading列为belongs_to/has_many/has_one/has_and_belongs_to_many的合法选项见 associations.rb 中构建选项列表及各类关联的文档示例如has_many :comments, strict_loading: true类级别提供strict_loading_by_default与strict_loading_mode两个 class_attribute见 core.rb可以按类开启默认严格加载并选择模式实例级别提供strict_loading!、strict_loading?方法支持:all与:n_plus_one_only两种模式违反严格加载时会经由ActiveRecord.action_on_strict_loading_violation决定处理方式默认:raise抛错并广播strict_loading_violation.active_recordinstrumentation 事件便于监控。这意味着既可以在模型上全局约束也可以在运行时对单条记录临时开启严格模式排查 N1。4. Delegated Types委托类型Delegated Types 是单表继承STI之外的另一种建模方案让超类成为一个具体的、拥有自己表的类每个子类拥有自己的表来存放各自的附加属性。源码 delegated_type.rb 中给出了完整的动机与示例以入口/消息/评论层次结构为例纯抽象类层次无法跨表分页Message 和 Comment 分属两张表没法用统一的 OFFSET/LIMIT 拉取 feed而 STI 又被迫把所有属性塞进一张巨型表子类属性高度分化时很尴尬。Delegated types 走中间路线# Schema: entries[ id, account_id, creator_id, entryable_type, entryable_id, created_at, updated_at ] class Entry ApplicationRecord belongs_to :account belongs_to :creator delegated_type :entryable, types: %w[ Message Comment ] end module Entryable extend ActiveSupport::Concern included do has_one :entry, as: :entryable, touch: true end end # Schema: messages[ id, subject, body, created_at, updated_at ] class Message ApplicationRecord include Entryable end # Schema: comments[ id, content, created_at, updated_at ] class Comment ApplicationRecord include Entryable end这里不是真正的继承而是通过委托形成层次结构、共享职责类似 Django 的 multi-table inheritance但机制是 delegation。源码文档还进一步说明了delegated_type关联默认使用entryable_id/entryable_type作为外键与类型列可用primary_key:、foreign_key:覆盖例如改用 UUID支持dependent: :destroy等常规关联选项还可通过 nested attributes 对 delegated_type 关联做嵌套参数化。5. Destroy Associations Async异步销毁关联该特性允许把dependent: :destroy这类级联销毁放到后台任务中执行避免在请求内销毁大量关联数据时触发超时等性能问题。从 associations.rb 的选项文档可以确认用法为dependent: :destroy_async源码文档同时给出明确警告不要在需要保证立即销毁的场景使用因为它依赖后台任务调度。各框架变更清单以下逐项继承自发布说明原文Changelog 均对应本仓库中各框架的变更记录文件。Railties详见 Railties Changelog。移除项Removals移除已弃用的rake notes任务移除rails dbconsole命令中已弃用的connection选项移除rails notes对已弃用环境变量SOURCE_ANNOTATION_DIRECTORIES的支持移除 rails server 命令的已弃用server参数移除使用HOST环境变量指定服务器 IP 的已弃用支持移除已弃用的rake dev:cache任务移除已弃用的rake routes任务移除已弃用的rake initializers任务。弃用项与显著变更本版本无。Action Cable详见 Action Cable Changelog。本版本无移除、无弃用、无显著变更条目。Action Pack详见 Action Pack Changelog。移除项移除已弃用的ActionDispatch::Http::ParameterFilter移除控制器级别的已弃用force_ssl。弃用项弃用config.action_dispatch.return_only_media_type_on_content_type。显著变更ActionDispatch::Response#content_type现在返回完整的 Content-Type 头例如带参数而不是之前可能只返回媒体类型。Action View详见 Action View Changelog。移除项数量较多完整列出移除ActionView::Template::Handlers::ERB中已弃用的escape_whitelist移除ActionView::Resolver中已弃用的find_all_anywhere移除ActionView::Template::HTML、ActionView::Template::RawFile、ActionView::Template::Text中已弃用的formats移除ActionView::PathSet与ActionView::ViewPaths中已弃用的find_file移除ActionView::LookupContext中已弃用的rendered_format移除ActionView::Base#initialize中传入非ActionView::LookupContext对象作为第一参数的已弃用支持以及已弃用的format参数移除ActionView::Template上的一批已弃用成员#refresh、#original_encoding、#variants、#formats、#virtual_path、#updated_at、initialize的updated_at参数、finalize_compiled_template_methods移除已弃用的config.action_view.finalize_compiled_template_methods配置移除ActionView::ViewPaths#with_fallback带 block 调用的已弃用支持移除render template:传绝对路径、render file:传相对路径的已弃用支持移除对不接受两个参数的模板 handler 的支持移除ActionView::Template::PathResolver的已弃用 pattern 参数移除在部分视图 helper 中调用对象私有方法的已弃用支持。显著变更要求ActionView::Base的子类必须实现#compiled_method_containerActionView::Template#initialize的locals参数变为必需javascript_include_tag和stylesheet_link_tag现在会生成Link头给现代浏览器提供预加载preload提示。可通过把config.action_view.preload_links_header设为false关闭。从当前仓库的 asset_tag_helper.rb 可看到该机制的落地mattr_accessor :preload_links_header作为全局开关helper 内部先判断preload_links_header配置可用preload_links_header:选项按单次调用覆盖再对非data:URI 的href收集 preload 链接并通过send_preload_links_header在响应中输出受MAX_HEADER_SIZE限制的头信息。Action Mailer详见 Action Mailer Changelog。移除项移除已弃用的ActionMailer::Base.receive官方替代方案是 Action Mailbox本仓库中对应 actionmailbox 框架。Active Record详见 Active Record Changelog。移除项移除ActiveRecord::ConnectionAdapters::DatabaseLimits中已弃用的方法column_name_length、table_name_length、columns_per_table、indexes_per_table、columns_per_multicolumn_index、sql_query_length、joins_per_query移除AbstractAdapter#supports_multi_insert?、AbstractAdapter#supports_foreign_keys_in_create?、PostgreSQLAdapter#supports_ranges?的已弃用方法移除ActiveRecord::Base#update_attributes与#update_attributes!长期被update/update!取代移除SchemaStatements#assume_migrated_upto_version的已弃用migrations_path参数移除config.active_record.sqlite3.represent_boolean_as_integer移除ActiveRecord::DatabaseConfigurations中已弃用的fetch、each、first、values、[]移除ActiveRecord::Result#to_hash移除在ActiveRecord::Relation方法中使用不安全原始 SQL 的已弃用支持。弃用项弃用ActiveRecord::Base.allow_unsafe_raw_sql弃用connected_to的database关键字参数当legacy_connection_handling设为false时弃用connection_handlers。显著变更MySQL唯一性校验器现在尊重数据库默认 collation默认不再强制大小写敏感比较。relation.create的初始化块与回调不再泄漏作用域到类级别的查询方法# Before User.where(name: John).create do |john| User.find_by(name: David) # nil end # After User.where(name: John).create do |john| User.find_by(name: David) # #User name: David, ... end命名 scope 链不再向外泄漏作用域class User ActiveRecord::Base scope :david, - { User.where(name: David) } end # Before: User.where(name: John).david # SELECT * FROM users WHERE name John AND name David # After: User.where(name: John).david # SELECT * FROM users WHERE name Davidwhere.not改为生成 NAND 谓词而非 NOR# Before: User.where.not(name: Jon, role: admin) # SELECT * FROM users WHERE name ! Jon AND role ! admin # After: User.where.not(name: Jon, role: admin) # SELECT * FROM users WHERE NOT (name Jon AND role admin)启用新的按库连接处理应用需把legacy_connection_handling改为false并移除connection_handlers上的已弃用访问器connects_to与connected_to的公开方法无需修改与前述五大特性第 1 条呼应。Active Storage详见 Active Storage Changelog。移除项移除向ActiveStorage::Transformers::ImageProcessing传:combine_options操作的已弃用支持移除已弃用的ActiveStorage::Transformers::MiniMagickTransformer移除已弃用的config.active_storage.queue移除已弃用的ActiveStorage::Downloading。弃用项弃用Blob.create_after_upload改用Blob.create_and_upload。显著变更新增Blob.create_and_upload创建一个新 blob 并把给定的io上传到服务新增ActiveStorage::Blob#service_name列。升级后必须运行一次迁移执行bin/rails app:update生成该迁移。Active Model详见 Active Model Changelog。本版本无移除与弃用。显著变更Active Model 的 errors 现在是一组对象提供了查询接口让应用能更轻松地处理和查询模型抛出的错误支持更精确的测试断言并能访问错误详情如model.errors[:title].count、model.errors.where(:body, :blank)这类用法。Active Support详见 Active Support Changelog。移除项移除config.i18n.fallbacks为空时回退到I18n.default_locale的已弃用行为移除LoggerSilence常量、ActiveSupport::LoggerThreadSafeLevel#after_initialize移除Module#parent_name、Module#parent、Module#parents移除一批已弃用文件active_support/core_ext/module/reachable、active_support/core_ext/numeric/inquiry、active_support/core_ext/array/prepend_and_append、active_support/core_ext/hash/compact、active_support/core_ext/hash/transform_values、active_support/core_ext/range/include_range移除ActiveSupport::Multibyte::Chars#consumes?与#normalize移除ActiveSupport::Multibyte::Unicode的pack_graphemes、unpack_graphemes、normalize、downcase、upcase、swapcase移除ActiveSupport::Notifications::Instrumenter#end。弃用项弃用ActiveSupport::Multibyte::Unicode.default_normalization_form。Active Job详见 Active Job Changelog。弃用项弃用config.active_job.return_false_on_aborted_enqueue。显著变更任务入队被中止aborted时现在直接返回false配合上一条配置项失去存在意义。Action Text详见 Action Text Changelog。本版本无移除与弃用。显著变更新增在富文本属性名后加?的方法用于确认富文本内容是否存在例如record.message.present?风格的检查新增系统测试 helperfill_in_rich_text_area定位 Trix 编辑器并填入给定的 HTML 内容新增ActionText::FixtureSet.attachment在数据库 fixtures 中生成action-text-attachment元素。Action Mailbox详见 Action Mailbox Changelog。弃用项弃用Rails.application.credentials.action_mailbox.api_key与环境变量MAILGUN_INGRESS_API_KEY改用Rails.application.credentials.action_mailbox.signing_key与MAILGUN_INGRESS_SIGNING_KEY语义从API key统一为signing key。Rails Guides详见 Guides Changelog本版本无显著变更条目。致谢发布说明最后致意所有为 Rails 贡献代码的贡献者——正是大量投入时间的众多贡献者才使 Rails 成为稳定且健壮的框架。附注如何在本仓库中核对本文内容五大特性的实现入口可分别查看连接处理、严格加载核心、委托类型、关联选项含:destroy_async与:strict_loadingAsset Link preload 头的实现见 asset_tag_helper.rb需要逐条核对 bug 修复细节时直接查阅各框架目录下的CHANGELOG.md如 activerecord/CHANGELOG.md。适用前提说明本文为 Rails 6.1 这一历史版本6-1 稳定分支的发布说明用于帮助理解 6.1 相对 6.0 的演进当前仓库主干已是更高版本实际开发中请以当前版本的指南与代码为准本文所列行为仅描述 6.1 发布时的语义。【免费下载链接】railsRuby on Rails项目地址: https://gitcode.com/GitHub_Trending/rai/rails创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表