Rails SQL:动态创建查询

问题描述 投票:1回答:2

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

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

sql ruby-on-rails arrays ruby
2个回答
2
投票

你需要用sql_params(称为*)传递splat operator,即

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

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

会给你相同的结果。

© www.soinside.com 2019 - 2024. All rights reserved.