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 查询。
我有书和标签。
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 查询。