【问题标题】:Rails SQL: Creating a query dynamicallyRails SQL:动态创建查询
【发布时间】:2017-12-21 18:44:46
【问题描述】:

我正在尝试根据用户输入创建动态查询

if a
  conditions << ["fname like (?)"]
  sql_params <<  "abc"
end
if b
  conditions << ["lname like (?)"]  
  sql_params <<  "def"  
end
if c
  cconditions << ["middle like (?)"]  
  sql_params <<  "xyz"   
end

results = Model.where(conditions.join(' AND '), sql_params)

虽然条件语法正确,但 sql_params 被列为数组。这形成了以下查询

Model.where("fname like (?) AND lname like (?) AND middle like (?)", ["abc","def","xyz"])

而我需要的是

Model.where("fname like (?) AND lname like (?) AND middle like (?)", "abc","def","xyz")

我在 sql_params 数组上尝试了几个 map/join 等选项,但没有任何效果。

【问题讨论】:

    标签: sql ruby-on-rails arrays ruby


    【解决方案1】:

    你确定你需要制作这个吗?

    Model.where("fname like (?) AND lname like (?) AND middle like (?)", "abc","def","xyz")
    

    某种形式:

    Model.where('expr1 AND expr2 AND expr3')
    

    相当于:

    Model.where('expr1').where('expr2').where('expr3')
    

    那么为什么不逐个构建查询而不是乱用字符串呢?像这样的:

    query = Model.all
    query = query.where('fname  like ?', 'abc') if a
    query = query.where('lname  like ?', 'def') if b
    query = query.where('middle like ?', 'xyz') if c
    

    会给你同样的结果。

    【讨论】:

      【解决方案2】:

      您需要将sql_params 与*(称为splat operator)一起传递,即

      results = Model.where(conditions.join(' AND '), *sql_params)
      

      【讨论】:

      • 你是救生员!非常感谢。我花了很多时间在这上面。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-21
      • 2013-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-12
      相关资源
      最近更新 更多