Rails 5.2.0移除ActiveRecord::Relation的substitute_values问题咨询
Rails 5.2.0移除ActiveRecord::Relation#substitute_values相关说明
ActiveRecord::Relation#substitute_values本身属于Rails的私有内部API,不在公开语义版本兼容的承诺范围内,所以官方没有在公开升级指南、弃用通知里单独标注该方法的移除信息。
移除原因
Rails 5.2版本对ActiveRecord的查询参数绑定逻辑做了整体重构,该方法负责的查询占位符匹配、参数值替换的原有逻辑,已经被整合进了ActiveRecord::Relation::QueryAttribute相关的内部处理链路中,没有保留对外暴露的同名或等价私有方法。
替代实现方案
如果你的业务代码之前调用了该私有方法实现相关功能,可以根据实际使用场景选择公开API替代:
- 若需要获取查询对应的绑定参数值集合,可调用5.2新增的公开方法
ActiveRecord::Relation#bound_attributes,返回的属性对象调用value即可拿到实际参数值 - 若需要生成参数替换完成的完整SQL语句,可通过
ActiveRecord::Base.connection.unprepared_statement块包裹查询后调用to_sql获取
代码示例
# 示例查询关系 user_relation = User.where(id: [1,5,9], status: :active) # 替代获取替换后的参数值 substituted_values = user_relation.bound_attributes.map(&:value) # 替代获取参数替换完成的完整SQL full_sql = ActiveRecord::Base.connection.unprepared_statement { user_relation.to_sql }
注意:私有API不受版本兼容规则保护,建议所有业务逻辑都基于官方公开的API实现,避免后续版本升级出现非预期的兼容性故障。
内容的提问来源于stack exchange,提问作者Ignacio Martínez
相关产品推荐
相关产品推荐

