我正在尝试基于用户输入创建动态查询
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选项,但没有任何效果。
答案 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
会给你相同的结果。