sql - Rails 4 查询带有数组数据类型错误的 postgresql 列

标签 sql ruby-on-rails ruby-on-rails-4 postgresql-9.2

我正在尝试在 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/

相关文章:

ruby-on-rails - 我应该如何将 RSpec 与 Rake、Rails 和我现有的测试集成?

Javascript 中的 HAML 中的 Javascript

SQL Server : check if variable is Empty or NULL for WHERE clause

mysql - 初学者 SQL 查询逻辑

ruby-on-rails - Rails Assets pipleline : compile to multiple stylesheets

ruby-on-rails - Rails 5.2.3/Heroku - 为什么不能在开发模式下使用 squlite3 在生产模式下运行 postgres?

ruby - pubnub 发布不发布

ruby-on-rails - Rails 4 : validate maximum value of integer

sql - 主键选择的性能

sql - 连接2个表计算时间差