【发布时间】:2014-06-09 04:07:32
【问题描述】:
这是我尝试过的查询:
@blogs = DB[:blogs].where(:title => params[:s_txt]).reverse_order(:id)
在此查询中,我想在我的数据库中查找博客。我还需要创建一个为用户提供更多结果的查询。我该怎么做?
【问题讨论】:
-
这和 Sinatra 有什么关系?
标签: ruby activerecord sinatra
这是我尝试过的查询:
@blogs = DB[:blogs].where(:title => params[:s_txt]).reverse_order(:id)
在此查询中,我想在我的数据库中查找博客。我还需要创建一个为用户提供更多结果的查询。我该怎么做?
【问题讨论】:
标签: ruby activerecord sinatra
最好使用dynamic parameters来避免SQL注入:
@blogs = DB[:blogs].where("title LIKE ?", "%#{params[:s_txt]}%").reverse_order(:id)
或
@blogs = DB[:blogs].where("title LIKE :text", text: "%#{params[:s_txt]}%").reverse_order(:id)
您可以轻松地为此添加更多参数:
@blogs = DB[:blogs].where("title LIKE ? OR content LIKE ?", "%#{params[:s_txt]}%", "%#{params[:s_txt]}%").reverse_order(:id)
或
@blogs = DB[:blogs].where("title LIKE :text OR content LIKE :text", text: "%#{params[:s_txt]}%").reverse_order(:id)
【讨论】:
我也遇到了这个问题,只找到了这个解决方案
@blogs = DB[:blogs].where("title LIKE '%#{params[:s_txt]}%'").reverse_order(:id)
好奇有没有更好的方法..
在两个字段中搜索是重复 LIKE 并用 AND 或 OR 分隔
@blogs = DB[:blogs].where("title LIKE '%#{params[:s_txt]}%'
or comment LIKE '%#{params[:c_txt]}%'").reverse_order(:id)
或者这样做
@blogs = DB[:blogs].where("title||comment LIKE '%#{params[:s_txt]}%'").reverse_order(:id)
在 Sqlite 中测试并且可以正常工作。一个建议:在大表中,如果可能的话,你最好去掉第一个 %,因为数据库会在不使用索引的情况下进行全表扫描,但你可以在 sql 问题中找到所有这些东西。
【讨论】:
"title LIKE '%?%'", params[:s_txt] 是首选。