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

如何在Squeel查询中将ID字段转文本以实现LIKE查询

解决Squeel中PostgreSQL主键ID的LIKE查询问题

问题根源

Squeel的DSL语法里,::会被解析为关联属性访问(比如id::text被识别成id.text),而非PostgreSQL的类型转换语法;同时=~默认映射为PostgreSQL的ILIKE(不区分大小写匹配),和预期的普通LIKE行为不符。

修正方案

  1. 用cast方法做类型转换
    Squeel提供了cast方法专门用于SQL类型转换,能正确生成id::text这样的SQL片段,避免被误解析为关联属性。

  2. 区分like和=~的用法

    • 普通区分大小写的LIKE:使用like方法
    • 不区分大小写的ILIKE:保留=~操作符

代码示例

普通LIKE查询(区分大小写)

criteria = "1"
Task.where{(id.cast(:text).like "%#{criteria}%")}.to_sql
# 生成SQL:SELECT "tasks".* FROM "tasks" WHERE (id::text LIKE '%1%')

安全的参数绑定写法(防止SQL注入)

Task.where{(id.cast(:text).like "%?%", criteria)}.to_sql
# 生成带占位符的SQL:SELECT "tasks".* FROM "tasks" WHERE (id::text LIKE $1)

不区分大小写的ILIKE查询

Task.where{(id.cast(:text) =~ "%#{criteria}%")}.to_sql
# 生成SQL:SELECT "tasks".* FROM "tasks" WHERE (id::text ILIKE '%1%')

内容的提问来源于stack exchange,提问作者Thomas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 12:25:19