【发布时间】:2021-09-07 19:07:26
【问题描述】:
如何在select_all 或exec_query 中使用数组(字符串或整数)作为in where 子句的绑定参数?
# imagine a long a complicated SQL statement
# containing many CTEs and
sql = <<~SQL
with things as (
select ....
where
x in ($1)
), morethings as (
select
)
select
sum(...),
avg(...)
from morethings
where categories in ($2)
SQL
binds = ??
ActiveRecord::Base.connection.exec_query(
sql,
"query name",
binds
).to_a
我可以像这样为标量生成绑定:
ActiveRecord::Relation::QueryAttribute.new("name", "Pascal", ActiveRecord::Type::String.new)
但不知道如何提供数组值,我似乎遗漏了一些东西。
背景:我想在 Rails 项目中运行一些原始 SQL 查询,并正确转义参数。 DB 是 Postgresql,但我认为有一种与 DB 无关的方式? 还是我必须使用原始连接。
查询与模型无关,可以转换为 Arel,但并不真正适合工作流程。
【问题讨论】:
-
你有没有想过看一下splat运算符freecodecamp.org/news/…?还是使用命名绑定(允许您使用命名哈希)?
-
@jad 我看不出 splats 或命名绑定如何解决问题。问题是传递一个 as 参数。
-
正如这篇文章中的答案所暗示的,您可能值得使用 Arel 来解决您的问题。如果您真的想按照您所说的方式执行此操作,并且想要将参数列表(而不是我还建议的一组命名参数)传递给 exec_query,您应该使用 splat 传递它们以便 exec 查询可以处理它们...但是如果您正在编写纯 SQL 代码并使用 Ruby 发送它,那么您错误地使用了 Ruby
-
数组中的元素个数事先是未知的。位置参数已编号。与泼溅恕我直言无关。如果我想执行 SQL 查询,我也不知道为什么我会错误地使用 Ruby。
-
Ruby on Rails 拥有整个对象的功能。如果您使用 Ruby,最好定义模型,并使用模型之间的关系到达您想要的位置。它提高了调试能力,一旦你开始理解它,它就更容易编码和理解。运行纯 SQL 然后希望使用结果是不可移植的,并且是调试的噩梦,尤其是在与其他程序员一起工作时
标签: ruby-on-rails postgresql activerecord