无法使用Rails中的find_by_sql方法正确构建查询

时间:2016-03-15 19:34:42

标签: ruby-on-rails ruby csv activerecord rails-activerecord

我有以下查询,我尝试使用IN子句基于多个部门ID获取部门表数据,但我在Rails服务器日志中看到的查询不正确,因此数据取文失败。报价问题。

我在这里尝试了两种不同的选项,但由于缺少引号或额外的引号,它们都失败了。

选项1(在CSV转换期间添加引号)

@depts = current_user.depts             
puts @depts                 # prints    IT Account Finance

# converting to CSV string here
@dept_ids_csv = @depts.gsub(" ", "','")     
puts @dept_ids_csv          # prints    IT','Account','Finance


@dept_data = Department.find_by_sql(["select * from departments a where a.dept_id in (?)", @dept_ids_csv])

预期查询日志:

select * from departments a where a.dept_id in ('IT','Account','Finance')

生成的实际查询日志(因为soem原因会自动附加额外的引号) - FAILS:

select * from departments a where a.dept_id in ('IT'',''Account'',''Finance')

选项2(在CSV转换期间删除引号)

@depts = current_user.depts             
puts @depts                 # prints    IT Account Finance

# converting to CSV string here 
@dept_ids_csv = @depts.gsub(" ", ",")   
puts @dept_ids_csv          # prints    IT,Account,Finance


@dept_data = Department.find_by_sql(["select * from departments a where a.dept_id in (?)", @dept_ids_csv])

预期查询日志:

select * from departments a where a.dept_id in ('IT','Account','Finance')

生成实际查询日志(IN子句中缺少引号) - FAILS:

select * from departments a where a.dept_id in ('IT,Account,Finance')

如何解决此问题?

2 个答案:

答案 0 :(得分:1)

尝试将字符串拆分为数组并将其传递给where子句。

@dept_data = Department.where(dept_id: @depts.split(" "))

答案 1 :(得分:0)

如何通过.split(' ')将字符串转换为数组?

示例:

@emails = ['spree@example.com', 'test@gmail.com']

User.find_by_sql(["SELECT * FROM spree_users WHERE email IN (?)", @emails])

给出

SELECT * FROM users WHERE email IN ('spree@example.com','test@gmail.com')