Рельсы: где ни одна из ассоциаций не имеет определенного значения - PullRequest
0 голосов
/ 03 мая 2018

У меня есть книги и теги.

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 ]

0 голосов
/ 03 мая 2018

приложение / модели / 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.
0 голосов
/ 03 мая 2018

Быстрое решение состоит в том, чтобы пойти с 2 запросами. Сначала вы получаете все идентификаторы книг, связанные с тегом, а затем выбираете все другие книги.

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

Я не уверен, что это лучшее решение, но, если честно, я не могу найти тривиальное без подзапросов / союзов / etc

...