打印

[问题求助] ruby sql模糊查询

ruby sql模糊查询

keizibans_controller. rb
字段 id,sincyaku,toukouhi
数据库 有2条记录 :
   1   NEW   2008/01/01 12:12:12
   2   UP    2008/05/01 12:12:12 
@strKeyword 隐藏项的值 = 进行模糊查询在页面上输入的值
 eg 我输入 N 或者 E 或者 W 结果出第一条记录
 # 1   NEW   2008/01/01 12:12:12

 @strKeyword = @params[:txtKeyword].to_s
    @strSql=""
    @strSql = @strSql + " SELECT * FROM studydb.keizibans k "
    @strSql = @strSql + "  where 1=1 "
    if @strKeyword != ""
      @strSql = @strSql + "  and sincyaku like '%" + @strKeyword +"%'"
    end
    @strSql = @strSql + "  order by toukouhi desc " 
    keizibans =Keiziban.find_by_sql(
        [@strSql]
     )
     return keizibans 


怎么搞啊??

TOP

我上面的代码有问题~~~

报错 冒是说 % 引起的,我E语太蓑了

TOP

关键SQL



@strSql = @strSql + "  and sincyaku like '%" + @strKeyword +"%'"


TOP

关键SQL

@strSql = @strSql + " and sincyaku like '%" + @strKeyword +"%'"

TOP

找到办法了

引用:
原帖由 wscc111 于 2008-2-28 17:01 发表
keizibans_controller. rb
字段 id,sincyaku,toukouhi
数据库 有2条记录 :
   1   NEW   2008/01/01 12:12:12
   2   UP    2008/05/01 12:12:12 
@strKeyword 隐藏项 ...


  def index
       @kejibans = Kejiban.find(:all, :conditions => sql)
  end 
  
  def sql
    strSql = "sincyaku like '%" + @params[:txtSincyaku].to_s + "%'"
    return strSql
  end


补充说明: 表名 kejibans, txtSincyaku: list.rhtml画面上的文本筐,用来输入的,当输 n 或者 u 等回进行模糊查询.
注意 txtSincyaku主要在一个form中

TOP

呵呵,自问自答,偶都来不及插嘴
其实用like,不管你想怎么用,你传给数据库的sql其实就是一个string字符串,问题出在没有生成对的string字符串吧

TOP

代码重构

好同志啊,自己解决问题,很好,很好(hao4)学:)

那么我能做的就是:帮你批改下作业:重构,据说重构很无情,呵呵

重构第一步:其实ruby最后一句就是他的返回值了,那么可以简化为

def sql
   "sincyaku like '%" + @params[:txtSincyaku].to_s + "%'"
end


重构第二步:@params在rails 2.0中被params替换了,所以修改为

   "sincyaku like '%" + params[:txtSincyaku].to_s + "%'"


还不如

%Q{sincyaku like  '%#{params[:txtSincyaku]}%'}


了。

重构第三步:请停止拼sql

def index
  @kejibans = Kejiban.find :all, :conditions => ['sincyaku  like ?',"%#{params[:txtSincyaku]}%"]
end


重构第四步:将你的数据库操作转到AR里面去

class Kejiban < AR
  class<<self
    def query(param)
     find :all,:conditions=>['sincyaku  like ?',"%#{param}%"]
    end
  end
end


action的代码修改为

def index
  @kejibans = Kejiban.query params[:sincyaku]
end


重构第五步:美化一下like (可以忽略)
其实我觉得rails2中的conditions通过hash来传递值功能蛮好,蛮强大的。不过可惜这里是like,不是=

  :sincyaku  =~  param


有几个插件支持这样的语法,你可以考虑自己再深入研究下。

Enjoy.

[ 本帖最后由 martin 于 2008-3-13 17:21 编辑 ]
本帖最近评分记录
  • wscc111 R币 +5 帮我杀了一只拦路虎! 2008-3-17 17:51
  • lgn21st R币 +5 赞~~~超赞~~~ 2008-3-14 11:48
  • maninred R币 +5 学习下。。。看重构的例子比看cgx照片爽! 2008-3-13 19:53

TOP

看重构的例子比看cgx照片爽!

martin就是实力派。
###
blog => red_world,
mail => [image]http://services.nexodyne.com/email/icon/NTbKP7EQRA%3D%3D/c2n6Sgw%3D/R01haWw%3D/0/image.png[/image]
###

TOP

非常感谢!

抛砖引玉! 多指导,我会改进代码的.

TOP

2008-11-23 23:48 Crawled by CCBot/1.0 (+http://www.commoncrawl.org/bot.html) @38.103.63.61