我有一个复选框字段(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
答案 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内部处理text
和character varying
类型是相同的,这是您唯一一次为varchar
所困扰(又称character varying
或t.string
(如果在迁移中),则是硬性限制了它们应该保留的时间(甚至可以将text
与CHECK约束一起使用)。