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
相关产品推荐
相关产品推荐

