直接上代码,下面这段是个 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])
#1 楼 @hz_qiuyuanxin
恩,是的 where 可以防注入。手上项目里有些写法,比如用到 oracle 的分析函数,比如 4 表联查,还是有拼SQL
的需要。自用的内网自动任务系统,注入不是很关注。
@hz那得把%%加到参数里就行啦
User.where(["username like ? and departure_date BETWEEN ? AND ?", "%rubist%", DateTime.now.beginning_of_day, DateTime.now.end_of_day])
@wangping @hz_qiuyuanxin ,
用 ruby 一直坚持的想法是够用就成
,%
两种位置在这里都可以。一般会扔参数里,传参数的人更清楚他想干啥
users = User.arel_table
User.where(users[:name].matches("%#{params[:search_text]}%"))