我正在尝试在Rails 4中查询一个包含PostgreSQL数组数据类型列的表。
以下是表模式:
create_table "db_of_exercises", force: true do |t|
t.text "preparation"
t.text "execution"
t.string "category"
t.datetime "created_at"
t.datetime "updated_at"
t.string "name"
t.string "body_part", default: [], array: true
t.hstore "muscle_groups"
t.string "equipment_type", default: [], array: true
end
以下查询有效:
SELECT * FROM db_of_exercises WHERE ('Arms') = ANY (body_part);
然而,这个查询并没有:
SELECT * FROM db_of_exercises WHERE ('Arms', 'Chest') = ANY (body_part);
它会抛出以下错误:
ERROR: operator does not exist: record = character varying
这对我也不起作用:
SELECT * FROM "db_of_exercises" WHERE "body_part" IN ('Arms', 'Chest');
这会导致出现以下错误:
ERROR: array value must start with "{" or dimension information
那么,在 ActiveRecord 中,我该如何查询一个包含数组数据类型的列呢?
我现在拥有的是:
@exercises = DbOfExercise.where(body_part: params[:body_parts])
我希望能查询与多个身体部位相关联的记录,这也是使用数组数据类型的整个目的,如果有人能够告诉我如何做到这一点,那就太好了。但我在文档中没有看到这个方法。
最终解决方案为:使用重叠运算符(&&):
SELECT * FROM db_of_exercises WHERE ARRAY['Arms', 'Chest'] && body_part;
我遇到了这个错误:
ERROR: operator does not exist: text[] && character varying[]
我将ARRAY ['Arms','Chest']强制转换为varchar:
SELECT * FROM db_of_exercises WHERE ARRAY['Arms', 'Chest']::varchar[] && body_part;
然后那个起作用了。
SELECT version()
) 是很好的习惯,尽管在这种情况下似乎并不重要。 - Craig Ringer