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

Sig*_*Sig 1 postgresql ruby-on-rails

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

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

t.text :qp_ids, array: true, default: []
Run Code Online (Sandbox Code Playgroud)

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

" ... 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(', ')})"
Run Code Online (Sandbox Code Playgroud)

但都产生一个PG::SyntaxError.

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

更新1

下面的代码可以工作,但非常难看,

" ... WHERE qp.id = IN (#{self.quality_process_ids.map {|id| "'#{id}'"}.join(',')})"
Run Code Online (Sandbox Code Playgroud)

Mar*_*iej 6

使用起来不是IN更简单吗?

" ... WHERE qp.id IN (#{project.qp_ids.join(',')})"
Run Code Online (Sandbox Code Playgroud)

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

your_model_instance.sanitize_sql_array(["project.qp_ids IN (?)", project.qp_ids])
 => "project.qp_ids IN ('foo','bar')"
Run Code Online (Sandbox Code Playgroud)

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