Rails 6中获取Model.limit(10)数值问题求助
问题原因与解决方案
这个问题我之前也踩过类似的坑,本质是Rails 6 之后 Arel 的参数化查询机制发生了变化:
在 Rails 4 中,Arel 处理 LIMIT 这类简单数值节点时,会直接把数值嵌入到生成的 SQL 字符串里;但到了 Rails 6,为了支持预编译语句、提升安全性和性能,Arel 会把这类数值包装成 Arel::Nodes::BindParam(绑定参数)节点,所以你用 SQLString 收集器拿到的就只是占位符 ?,而不是实际的数值。
正确的解决方式
不需要通过收集 SQL 字符串来获取数值,直接访问 Limit 节点的 value 属性即可,这是跨 Rails 版本兼容的写法:
def visit_Arel_Nodes_SelectStatement(o, collector) if o.limit # 直接获取limit的实际数值 puts o.limit.value end end
补充说明
o.limit 是 Arel::Nodes::Limit 类型的对象,它的 value 属性存储的就是你调用 Model.limit(10) 时传入的原始数值(这里就是 10)。如果你的 limit 是更复杂的表达式(比如子查询),value 会是对应的 Arel 节点,这时可以根据实际需求进一步处理,但对于普通的数值场景,直接取 value 就完全够用了。
内容的提问来源于stack exchange,提问作者akhil
相关产品推荐
相关产品推荐

