【问题标题】:How to query array columns in Rails 4?如何在 Rails 4 中查询数组列?
【发布时间】:2015-10-12 15:31:41
【问题描述】:

我找不到任何关于如何在 Rails 中查询array columns 的好文章。我遇到了在 Rails 中查询 Array 列的需求。

我从一篇教如何进行基本查询的文章中找到here。

让我们按照文章中的例子,Book 覆盖了许多subjects,并且主题存储为数组列:

add_column :books, :subjects, :text, array: true, default: []

查询包含特定主题的书籍 - 例如历史

Book.where("'history' = ANY (subjects)")

查询包含所有列出主题的书籍 - 例如金融、商业和会计

Book.where("subjects @> ?", "{Finance,Business,Accounting}")

我想知道如何执行以下操作?

查询包含任何所列主题的图书 - 例如小说或传记

查询不包含特定主题的书籍 - 例如不是物理

查询不包含任何主题的书籍 - 例如不是(物理或化学或生物学)

是否有任何Rails 的方式来进行上述查询?

【问题讨论】:

    标签: ruby-on-rails arrays ruby postgresql


    【解决方案1】:
    1. 通常,associations 是解决问题的更好方法:

      Book has_many :subjects # or has_one/has_and_belongs_to_many

      Subject belongs_to :book # or has_and_belongs_to_many

      然后只需创建一个表subjects,将所有主题保存在那里就可以设置了。

    2. 您的查询:

    查询包含任何列出的主题的书籍 - 例如小说或 传记

    Book.find_by_sql "SELECT * FROM books WHERE 'Fiction' = ANY (subjects) OR 'Biography' = ANY (subjects)"
    

    查询不包含特定主题的书籍 - 例如不是物理

    Book.where.not("subjects @> ?", "{Physics}")
    

    查询不包含任何主题的书籍 - 例如不是 (物理或化学或生物学)

    Book.find_by_sql "SELECT * FROM books WHERE books NOT IN (SELECT * FROM books WHERE 'Physics' = ANY (subjects) OR 'Chemistry' = ANY (subjects) OR 'Biology' = ANY (subjects)"
    

    【讨论】:

    • 嗯,我看到postgres和Rails 4出来了数组列。我想有时存储为数组列时性能实际上更好?我可能会问一个新问题,看看是否有人可以评估何时使用数组列以及何时使用关联
    • 那为什么要创建数组列呢?我认为 Rails 打算采用一些 noSQL 方法来存储数据?我不是这方面的专家,想了解更多,我认为如果 Rails 4 / Postgres 决定实施它,一定有原因吗?我们可以将此讨论转移到另一个线程。 => stackoverflow.com/questions/31569511/…
    • @ChrisYeung 尽管有单独问题的结果,但如果这个答案对查询有帮助,请告诉我
    • 第一段中的坏建议 - 将数组数据存储在数据库中是有正当理由的。如果没有足够好的用例,则数据类型将不存在(尽管我同意在 OP 的情况下它应该是一个关联)。但是,+1 用于实际提供如何查询数组数据类型和回答 OP 问题的解决方案。
    【解决方案2】:

    为了,

    查询包含任何列出的主题的书籍 - 例如小说或传记

    Book.where("subjects &&  ?", "{Fiction,Biography}")
    

    查询不包含特定主题的书籍 - 例如不是物理学

    Book.where("subjects <>  ?", "{Physics}")
    

    查询不包含任何主题的书籍 - 例如不是(物理或化学或生物学)

    Book.where.not("subjects &&  ?", "{Physics,Chemistry,Biology}")
    

    可以参考Postgres的数组函数。

    https://www.postgresql.org/docs/8.2/functions-array.html

    【讨论】:

    • 你如何用动态主题查询这个?
    猜你喜欢
    • 1970-01-01
    • 2013-06-27
    • 2019-04-30
    • 2015-07-04
    • 2013-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    相关资源
    最近更新 更多