Rails 关于 join (",") 的用法 (代码优化)

easonlovewan · 2015年09月18日 · 最后由 easonlovewan 回复于 2015年09月18日 · 2036 次阅读

一个根据内容和用户的联合查询。。。现有一问题:当我传递两个参数时,怎么将两个参数中间加一个逗号,不太会用 join(",") 希望大牛指点,另外感觉代码需优化的地儿太多了。。。望指点!!!当我输入两个参数时 query_str 如下: "{query: {bool: {must: [{match: {content: params[:q]}} {match: {user_id: params[:user_id]}}] }},:highlight=>{:fields=>{:content=>{}}}}"

def index
  @page_title = "评论列表"
  if params[:q].present? || params[:user_id].present?
    query_str = "{query: {bool: {must: ["
    query_str += "{match: {content: params[:q]}}" if params[:q].present?
    query_str += "{match: {user_id: params[:user_id]}" if params[:user_id].present?
    query_str += "}] }},:highlight=>{:fields=>{:content=>{}}}}"
    query = eval(query_str)
  else
    query = {query: { match_all: {} }, sort: {updated_at: {order: "desc"}}} #当没有查询条件时按照update排序
  end
  @comments = Comment.__elasticsearch__.search(query).paginate(page: params[:page] || 1, per_page: params[:per_page] || 20)
  @records = @comments.records.load
end

Updated by @huacnlee 这代码就真的对不齐么,每次都要我来!

这样拼 query str 看着太蛋疼了,而且很容易出错,可不可以做一个 jbuilder 的模板来生成 query_str?多个参数你可以传一个数组进去用 each 来渲染生成,也避免了加逗号分隔

.................. 看得难受,用 Hash to_json 啊

#1 楼 @alucardpj 嗯嗯,我也感觉相当恶心,,,之前这样写过:

conds = []
conds << {content: params[:q]} if params[:q].present?
conds << {user_id: params[:user_id]} if params[:user_id].present?
query = {query: {bool: {must: conds.map{ |c| {match: c} } }}}
@comments = Comment.__elasticsearch__.search(query).paginate(page: params[:page] || 1, per_page: params[:per_page] || 20)
@records = @comments.records.load

这样写虽然解决了逗号问题,代码整体看着也很舒服,不过有一个前提是当没有参数时,要按照 update_at 的降序查,有参数的话按照,:highlight=>{:fields=>{:content=>{}}}这样去查,所以。。。。

eval 是魔鬼,参数里面传过来一个 system('rm /') ... 同时效率也是问题

#3 楼 @easonlovewan 做个模板来套不行吗?像你说的这种分支情况,可以在模板里面设定判断,实在不行,做两套模板调用也可以呀

自己拼字符串小心被注入。

#6 楼 @rei 正在优化,感谢提醒!

需要 登录 后方可回复, 如果你还没有账号请 注册新账号