如何在Squeel查询中将ID字段转文本以实现LIKE查询
解决Squeel中PostgreSQL主键ID的LIKE查询问题
问题根源
Squeel的DSL语法里,::会被解析为关联属性访问(比如id::text被识别成id.text),而非PostgreSQL的类型转换语法;同时=~默认映射为PostgreSQL的ILIKE(不区分大小写匹配),和预期的普通LIKE行为不符。
修正方案
用
cast方法做类型转换
Squeel提供了cast方法专门用于SQL类型转换,能正确生成id::text这样的SQL片段,避免被误解析为关联属性。区分
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
相关产品推荐
相关产品推荐

