Ruby on rails 如何在Rails 4中查询数组列?

Ruby on rails 如何在Rails 4中查询数组列?,ruby-on-rails,arrays,ruby,postgresql,Ruby On Rails,Arrays,Ruby,Postgresql,我找不到任何关于如何在Rails中查询数组列的好文章。我发现需要在Rails中查询数组列 我从一篇教授如何进行基本查询的文章中发现 让我们按照文章中的示例进行操作,Book涵盖了许多主题,主题存储为一个数组列: add_column :books, :subjects, :text, array: true, default: [] 查询包含特定主题的书籍-例如历史 查询包含所有列出科目的账簿-例如财务、商业和会计 我想知道我怎样才能做到以下几点 查询包含任何列出主题的书籍——例如小说或传记

我找不到任何关于如何在Rails中查询
数组列的好文章。我发现需要在Rails中查询数组列

我从一篇教授如何进行基本查询的文章中发现

让我们按照文章中的示例进行操作,
Book
涵盖了许多
主题
,主题存储为一个数组列:

add_column :books, :subjects, :text, array: true, default: []
查询包含特定主题的书籍-例如历史

查询包含所有列出科目的账簿-例如财务、商业和会计


我想知道我怎样才能做到以下几点

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

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

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

是否有任何
Rails
方法来执行上述查询

  • 通常,解决问题的更好方法是:

    这本书有很多:主题#或有一个/有#和"属于"很多

    主题属于:书或有且属于许多

    然后只需创建一个表
    主题
    ,将所有主题保存在该表中,即可完成设置

  • 您的疑问:

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

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

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

    因为

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

    Book.where("subjects &&  ?", "{Fiction,Biography}")
    
    Book.where.not("subjects &&  ?", "{Physics,Chemistry,Biology}")
    
    查询不包含特定主题的书籍-例如,不包括物理

    Book.where("subjects <>  ?", "{Physics}")
    
    您可以参考Postgres的数组函数


    Hmm,我看到postgres和Rails 4附带了数组列。我想有时候存储为数组列时,性能实际上会更好?我可能会问一个新问题,看看是否有人可以评估何时使用数组列以及何时使用关联。那么为什么要创建数组列?我假设rails打算采用某种noSQL方法来存储数据?我不是这方面的专家,我想了解更多,我想如果Rails4/Postgres决定实施它,一定有原因吧?我们可以将此讨论转移到另一个线程。=>@Chrisyang尽管有单独问题的结果,但请让我知道,如果这个答案对第一段中的queriesBad建议有帮助,请告诉我-有充分的理由将数组数据存储在数据库中。如果没有足够好的用例,数据类型就不存在(尽管我同意OP的情况下,它应该是一个关联)。但是,+1实际上提供了如何查询数组数据类型的解决方案,并回答了OP的问题。您将如何使用动态主题查询这个问题?
    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)"
    
    Book.where("subjects &&  ?", "{Fiction,Biography}")
    
    Book.where("subjects <>  ?", "{Physics}")
    
    Book.where.not("subjects &&  ?", "{Physics,Chemistry,Biology}")