在以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(',')})"
答案 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
子句中使用的条件。