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 在内部处理 textcharacter varying 类型相同,这是唯一一次你会为 varchar 而烦恼(又名 character varyingt.string 在迁移中)是如果你对它们的长度有硬性限制(即使这样你也可以使用 text 和 CHECK 约束)。