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

时间:2018-10-16 03:15:53

标签: ruby-on-rails postgresql

在以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(',')})"

1 个答案:

答案 0 :(得分:2)

使用IN会更简单吗?

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

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

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

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