ActiveRecord :: StatementInvalid(PG :: UndefinedFunction

时间:2019-03-21 04:57:56

标签: ruby-on-rails postgresql activerecord ruby-on-rails-5.2

我有一个复选框字段(car_options),其中存储用于多个选择的值数组。

我需要查询包含另一个数组中任何值的所有Car记录。

[“ a”,“ b”,“ c”,“ d”,“ e”,“ f”]包含以下任何[[b],“ z”,“ v”]

架构

t.string "car_options", default: [], array: true

Check if attr array contains any of element from given array in Rails

我的查询:

 Car.where('car_options && ARRAY[?]', ["4door","3seat"])

错误

  

ActiveRecord :: StatementInvalid(PG :: UndefinedFunction:错误:   运算符不存在:字符变化[] &&文本[])第1行:   ... cars“。*在“ cars”中(car_options && ARRAY ['... ^

     

提示:没有运算符匹配给定的名称和参数类型。您   可能需要添加显式类型转换。 :选择“汽车”。*从“汽车”   在哪里(car_options && ARRAY ['BY'])限制$ 1

1 个答案:

答案 0 :(得分:2)

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约束一起使用)。