如何在Rails Console启动时自动加载模型Schema?
Rails 8 下 .irbrc 自动连接数据库配置失效的解决办法
问题重现
之前在 .irbrc 里用这段代码实现Rails Console启动时自动连库,避免查询模型时出现连接提示:
# ~/.irbrc if defined? Rails ActiveSupport.on_load(:active_record) do connection end end
升级到Rails 8后完全失效:
- Rails 7中调用
User会直接返回模型字段结构 - Rails 8中调用
User会提示:User (call 'User.load_schema' to load schema informations)
尝试直接调用ActiveRecord::Base.load_schema时还会报错:
>> ActiveRecord::Base.load_schema (stackoverflow):1:in '<main>': ActiveRecord::Base has no table configured. Set one with ActiveRecord::Base.table_name= (ActiveRecord::TableNotSpecified)
原因
Rails 8新增了Schema延迟加载优化,默认不会在建立数据库连接后自动加载所有模型的Schema信息,只有当显式访问模型的Schema(比如调用User.columns)时才会触发加载,因此原来仅建立连接的配置无法再自动触发Schema加载。
解决办法
修改 .irbrc 代码,在建立数据库连接后,遍历所有已定义的ActiveRecord模型并触发Schema加载:
# ~/.irbrc if defined? Rails ActiveSupport.on_load(:active_record) do # 建立数据库连接 connection # 加载所有已定义模型的Schema ActiveRecord::Base.descendants.each(&:load_schema) end end
如果希望一次性加载所有未预加载的模型(更彻底),可以使用eager_load!:
# ~/.irbrc if defined? Rails ActiveRecord::Base.connection Rails.application.eager_load! end
验证
重启Rails Console后,直接输入User即可看到完整的模型字段结构,不会再出现Schema加载提示。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

