Rails [已解决] String 在拼 SQL 时候 like 的通配符% 怎么解

numberaugust · 2014年02月20日 · 最后由 ericguo 回复于 2014年11月02日 · 6709 次阅读

直接上代码,下面这段是个 SQL 样例。 问题:sql_template里包含了非参数占位符的%,导致拼接字符串报错。

sql_template = %q{
  select id from users
  where username like '%%s%' and departure_date>'%s'
}
self.find_by_sql(sql_template % [rubist, '2014-02-20'])

Google 过大都建议用 Activerecord::Base 提供的 where() 方式。实际系统里存在多表联查使用 db 特性、SQL 片断复用等场景,有时候的确需要这么拼 SQL。

求解,谢谢大伙~~

已经解决: 试出来了,%%转码%为普通字符,即可。

这样能满足你的需求么?

User.where("username like %?%", "rubist").where("departure_date BETWEEN ? AND ?", DateTime.now.beginning_of_day, DateTime.now.end_of_day)

where 的好处是能帮你处理一些 SQL 的问题如防止 SQL 注入。

#1 楼 @hz_qiuyuanxin 为毛拆成 2 句??

User.where(["username like %?% and departure_date BETWEEN ? AND ?", "rubist", DateTime.now.beginning_of_day, DateTime.now.end_of_day])
3 楼 已删除

#1 楼 @hz_qiuyuanxin 恩,是的 where 可以防注入。手上项目里有些写法,比如用到 oracle 的分析函数,比如 4 表联查,还是有拼SQL的需要。自用的内网自动任务系统,注入不是很关注。

#2 楼 @wangping 仅仅是写法的问题,个人喜欢一个条件一个 where

#4 楼 @numberaugust 那你现在的问题是什么?

#6 楼 @hz_qiuyuanxin 现在是因为sql_template里包含了非参数占位符的%,导致拼接字符串报错。

@hz那得把%%加到参数里就行啦

User.where(["username like ? and departure_date BETWEEN ? AND ?", "%rubist%", DateTime.now.beginning_of_day, DateTime.now.end_of_day])

#7 楼 @numberaugust

试了一下,确实会出错。最直接的话也可以用拼接,而不是用 %

又或者再具体点,也许可以用 arel 解决

#8 楼 @wangping 这样也可以!但是外面要去处理这一个,有时候就感觉不是那么好,个人看法 ..

@wangping @hz_qiuyuanxin , 用 ruby 一直坚持的想法是够用就成%两种位置在这里都可以。一般会扔参数里,传参数的人更清楚他想干啥 😄

最好写成这样吧 "xx LIKE ?", "%#{term}%"

#12 楼 @small_fish__ %s换成?,一会儿我试试去,谢啦~

users = User.arel_table
User.where(users[:name].matches("%#{params[:search_text]}%"))
需要 登录 后方可回复, 如果你还没有账号请 注册新账号