代码之家  ›  专栏  ›  技术社区  ›  Railsana

Rails:其中没有任何关联具有特定值

  •  0
  • Railsana  · 技术社区  · 8 年前

    我有书和标签。

    def Book < ApplicationRecord
      has_and_belongs_to_many :tags
    end
    
    def Tag < ApplicationRecord
      has_and_belongs_to_many :books
    end
    

    我想找到所有这样的书 将标签与 id 1 相关。(它们可能没有标签。)我试过这个:

    Book.includes(:tags).where.not(tags: { id: 1 })
    

    此查询查找所有没有标记的书籍、具有其他标记的书籍和 书籍 不需要的标记和至少一个其他标记 与之关联。

    如何筛选具有特定标签的所有书籍?谢谢你的建议!

    2 回复  |  直到 8 年前
        1
  •  2
  •   Jay-Ar Polidario    8 年前

    应用程序/型号/书籍\u标签。rb型

    class BooksTag < ApplicationRecord
      belongs_to :book
      belongs_to :tag
    end
    

    解决方案:

    Book.where.not(id:
      BooksTag.where(tag_id: 1).select(:book_id)
    )
    
    • 与安东的回答类似,我想不出只有一个查询解决方案。
    • 我添加了 books_tag 模型,这样我们就不需要执行联接SQL查询。
        2
  •  0
  •   AntonTkachov    8 年前

    快速解决方案是处理2个请求。首先,您获得所有具有关联标记的图书ID,然后选择所有其他图书。

    unwanted_book_ids = Books.joins(:tags).where(tags: { id: 1 }).pluck('books.id').uniq
    @books = Book.where.not(id: unwanted_book_ids)
    

    我不确定这是不是最好的解决方案,但老实说,如果没有子查询/联合等,我找不到任何微不足道的解决方案

    推荐文章