ActiveRecord::StatementInvalid (PG::UndefinedFunction
ActiveRecord::StatementInvalid (PG::UndefinedFunction
我有一个复选框字段 (car_options),用于存储多个选项的值数组。
我需要查询包含另一个数组中任何值的所有 Car 记录。
["a","b","c","d","e","f"] 包含以下任何一项 ["b", "z","v"]
架构
t.string "car_options", default: [], array: true
我的查询:
Car.where('car_options && ARRAY[?]', ["4door","3seat"])
错误
ActiveRecord::StatementInvalid (PG::UndefinedFunction: ERROR:
operator does not exist: character varying[] && text[]) LINE 1:
...cars".* FROM "cars" WHERE (car_options && ARRAY['...^
HINT: No operator matches the given name and argument types. You
might need to add explicit type casts. : SELECT "cars".* FROM "cars"
WHERE (car_options && ARRAY['BY']) LIMIT
PostgreSQL 抱怨是因为 ARRAY[?]
最终成为 text[]
(即 text
的数组),而您的 car_options
列是 character varying[]
(即 character varying
).
数组
您可以转换数组字面量:
Car.where('car_options && ARRAY[?]::varchar[]', ["4door","3seat"])
或使列 text[]
:
t.text "car_options", default: [], array: true
我可能会选择后者,因为 PostgreSQL 在内部处理 text
和 character varying
类型相同,这是唯一一次你会为 varchar
而烦恼(又名 character varying
或 t.string
在迁移中)是如果你对它们的长度有硬性限制(即使这样你也可以使用 text
和 CHECK 约束)。
我有一个复选框字段 (car_options),用于存储多个选项的值数组。
我需要查询包含另一个数组中任何值的所有 Car 记录。
["a","b","c","d","e","f"] 包含以下任何一项 ["b", "z","v"]
架构
t.string "car_options", default: [], array: true
我的查询:
Car.where('car_options && ARRAY[?]', ["4door","3seat"])
错误
ActiveRecord::StatementInvalid (PG::UndefinedFunction: ERROR: operator does not exist: character varying[] && text[]) LINE 1: ...cars".* FROM "cars" WHERE (car_options && ARRAY['...^
HINT: No operator matches the given name and argument types. You might need to add explicit type casts. : SELECT "cars".* FROM "cars" WHERE (car_options && ARRAY['BY']) LIMIT
PostgreSQL 抱怨是因为 ARRAY[?]
最终成为 text[]
(即 text
的数组),而您的 car_options
列是 character varying[]
(即 character varying
).
您可以转换数组字面量:
Car.where('car_options && ARRAY[?]::varchar[]', ["4door","3seat"])
或使列 text[]
:
t.text "car_options", default: [], array: true
我可能会选择后者,因为 PostgreSQL 在内部处理 text
和 character varying
类型相同,这是唯一一次你会为 varchar
而烦恼(又名 character varying
或 t.string
在迁移中)是如果你对它们的长度有硬性限制(即使这样你也可以使用 text
和 CHECK 约束)。