我正在尝试在 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;
这很有效。
最佳答案
我不认为它与rails有关。
如果您执行以下操作会怎样?
SELECT * FROM db_of_exercises WHERE 'Arms' = ANY (body_part) OR 'Chest' = ANY (body_part)
我知道rails 4支持Postgresql ARRAY数据类型,但我不确定ActiveRecord是否创建了用于查询数据类型的新方法。也许你可以使用Array Overlap
我的意思是&&运算符,然后做类似的事情:
WHERE ARRAY['Arms', 'Chest'] && body_part
或者看看这个 gem :https://github.com/dockyard/postgres_ext/blob/master/docs/querying.md
然后执行如下查询:
DBOfExercise.where.overlap(:body_part => params[:body_parts])
关于sql - Rails 4 查询带有数组数据类型错误的 postgresql 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17374688/