Rails SQL:动态创建查询

时间:2017-12-21 18:44:47

标签: sql ruby-on-rails arrays ruby

我正在尝试基于用户输入创建动态查询

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 etc选项,但没有任何效果。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

你确定你需要准确地生产这个吗?

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

会给你相同的结果。