【问题标题】:Convert sql to ActiveRecord scope将 sql 转换为 ActiveRecord 范围
【发布时间】:2017-09-19 06:23:42
【问题描述】:
我有以下sql:
select * from slide_results where tags @> ARRAY['pro']::varchar[]
我将其转换为 ActiveRecord 范围:
scope :by_tags, ->(tags) { where('tags @> ?', "{ARRAY[pro]::varchar[]}") }
但不幸的是它没有返回相同的结果?
我做错了什么?
【问题讨论】:
标签:
sql
ruby-on-rails
postgresql
activerecord
【解决方案1】:
你有你的ARRAY[...] 并且投错了地方,你有一些杂散的括号;此外,类型转换不应该是必需的。你应该说:
where('tags @> array[?]', 'pro')
否则,ActiveRecord 会将 {ARRAY[pro]::varchar[]} 视为单个字符串,应将其转义并用单引号括起来,从而产生:
tags @> '{ARRAY[pro]::varchar[]}'
因为'{ARRAY[pro]::varchar[]}' 不能满足您的要求,它只是一个 SQL 字符串文字。
如果数组的内容总是'pro' 那么你可以直接去:
where("tags @> array['pro']")
因为占位符并不是真正需要的。