You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails 6使用Zeitwerk时如何正确扩展ApplicationRecord避免弃用警告

规范实现方案

方案1:直接在ApplicationRecord原生定义中引入(最推荐,适合普通应用场景)

绝大多数场景下你完全不需要用初始化器去扩展,直接把模块引入逻辑写在app/models/application_record.rb内部即可,完全符合Rails约定,不会触发任何弃用警告:

# app/models/application_record.rb
class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true
  include FancyMethods
end

方案2:使用ActiveSupport加载钩子(适合引擎/gem扩展、不能修改原生ApplicationRecord的场景)

如果确实需要在不改动应用内ApplicationRecord文件的前提下做扩展,用Rails官方提供的组件加载钩子替代to_prepare块,完全规避初始化阶段自动加载的问题:

# 放置在config/initializers/ 目录下的任意初始化文件中
ActiveSupport.on_load(:active_record) do
  # Rails 6 环境可以加这行确保ApplicationRecord已加载
  require_dependency Rails.root.join('app/models/application_record')
  ApplicationRecord.include FancyMethods
end

原警告触发原因

你之前收到弃用警告,是因为把重开ApplicationRecord类的逻辑直接放在了初始化器中:Rails加载初始化器的阶段属于初始化流程,此时自动加载FancyMethods这个可重载常量会导致后续代码重载时改动不生效,不符合Zeitwerk加载器的设计规则。

用上述两种方案都可以彻底解决问题,且完全符合Rails官方规范,没有代码坏味道。

内容的提问来源于stack exchange,提问作者Peter P.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 22:06:03