在原始 SQL 查询中插值 PG 数组



在以PG(10(为数据库的Rails(5.2(应用程序中,我需要执行原始SQL查询。

在查询中,我需要添加一个WHERE子句,用于检查qp.id是否在存储为字符串数组的project.qp_ids中。

t.text :qp_ids, array: true, default: []

我尝试了几种解决方案,其中包括以下

" ... WHERE qp.id = ANY #{project.qp_ids}"
" ... WHERE qp.id = ANY #{project.qp_ids.join(', ')}"
" ... WHERE qp.id = ANY ARRAY(#{project.qp_ids.join(', '))}"
" ... WHERE qp.id = IN (#{project.qp_ids.join(', ')})"

但都产生了PG::SyntaxError.

插值PG数组的正确方法是什么?

UPDATE1

下面的代码有效,但非常丑陋,

" ... WHERE qp.id = IN (#{self.quality_process_ids.map {|id| "'#{id}'"}.join(',')})"

使用IN不是更简单吗?

" ... WHERE qp.id IN (#{project.qp_ids.join(',')})"

要处理字符串引用,您可以直接使用ActiveRecord的清理

your_model_instance.sanitize_sql_array(["project.qp_ids IN (?)", project.qp_ids])
=> "project.qp_ids IN ('foo','bar')"

生成可在WHERE子句中使用的条件。

最新更新