将sql转换为ActiveRecord范围

时间:2017-09-19 06:23:42

标签: sql ruby-on-rails postgresql activerecord

我有以下sql:

select * from slide_results where tags @> ARRAY['pro']::varchar[] 

我将其转换为ActiveRecord范围:

scope :by_tags, ->(tags) { where('tags @> ?', "{ARRAY[pro]::varchar[]}") }

但不幸的是它没有返回相同的结果? 我做错了什么?

1 个答案:

答案 0 :(得分:0)

你有ARRAY[...]并且在错误的地方施放,你有一些流浪的支撑;此外,不应该进行打字。你应该说:

where('tags @> array[?]', 'pro')

否则,ActiveRecord会将{ARRAY[pro]::varchar[]}视为一个单独的字符串,该字符串应该被转义并包含在单个引号中,产生:

tags @> '{ARRAY[pro]::varchar[]}'

它不能做你想要的'{ARRAY[pro]::varchar[]}'只是一个SQL字符串文字。

如果数组的内容始终只是'pro',那么您可以直接进入:

where("tags @> array['pro']")

因为占位符不是必需的。