Rails:其中 none 的关联具有一定的价值

Rails: Where none of the associations have a certain value

我有书和标签。

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 个请求。首先,您获得所有具有关联标签的图书 ID,然后您 select 所有其他图书。

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

我不确定这是最好的解决方案,但是老实说,如果没有 subqueries/unions/etc

,我找不到任何微不足道的解决方案

app/models/books_tag.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 模型,这样我们就不需要执行 JOIN SQL 查询。