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

Rails4升级至Rails5(5.0.7.2)后without_sticking方法失效求助

解决Rails5升级后without_sticking方法失效问题

问题原因

升级到Rails5.0.7.2后,ActiveRecord::Base.connection返回的是原生Mysql2Adapter实例而非Makara的代理对象,导致找不到without_sticking方法——这是因为旧版本Makara未适配Rails5的连接适配器初始化逻辑,或者数据库配置未正确触发Makara的连接包装。

解决步骤

1. 升级Makara到兼容Rails5的版本

旧版Makara(如0.x系列)不支持Rails5,需更新Gemfile中的Makara版本:

gem 'makara', '~> 1.5' # 该系列适配Rails 5.x

执行bundle update makara完成升级。

2. 修正without_sticking的调用方式

在适配Rails5的Makara版本中,推荐直接通过模型类调用该方法,而非直接操作connection:

ActiveRecord::Base.without_sticking do
  find_by_sql(sql)
end

如果需要指定连接角色(如强制主库),可传入参数:

ActiveRecord::Base.without_sticking(:master) do
  find_by_sql(sql)
end

3. 验证数据库配置正确性

确保database.yml中已正确配置Makara的主从结构,示例配置:

production:
  adapter: makara_mysql2
  database: your_db
  makara:
    connections:
      - role: master
        host: master_db_host
        username: root
        password: your_password
      - role: slave
        host: slave_db_host
        username: root
        password: your_password

配置后,ActiveRecord::Base.connection应返回Makara::Proxy实例而非原生适配器。

4. 临时替代方案(若无法升级Makara)

如果暂时无法升级Gem,可手动强制切换到主库执行逻辑:

ActiveRecord::Base.connection_pool.with_connection do |conn|
  if conn.respond_to?(:makara_force_master)
    conn.makara_force_master do
      find_by_sql(sql)
    end
  else
    # 未使用Makara时直接执行
    find_by_sql(sql)
  end
end

内容的提问来源于stack exchange,提问作者opensource-developer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 15:05:18