我正在尝试在 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])
我希望能够查询具有多个关联的 body_part 的记录,这就是使用数组数据类型的全部意义所在,所以如果有人能启发我如何做到这一点,那就太棒了。我在文档中的任何地方都没有看到它。
后代的最终解决方案:
使用重叠运算符 (&&):
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;
那行得通。