Rails фильтрует записи во многих отношениях - PullRequest
0 голосов
/ 18 января 2019

У меня есть много ко многим отношениям для книг и авторов, таких как:

class Book < ApplicationRecord
  has_many :books_authors, inverse_of: :author, dependent: :destroy
  has_many :authors, through: :books_authors
end

class Author < ApplicationRecord
  has_many :books_authors, dependent: :destroy
  has_many :books, through: :books_authors
end

class AuthorsBook < ApplicationRecord
  belongs_to :author
  belongs_to :book
end

Теперь, чтобы получить все Books с Authors из ids: 1 and 3 Запрос выглядит так:

Book.joins(:authors).where(authors: {id:  [1, 3]}).uniq

Book.joins(:books_authors).where(books_authors: {author_id:  [1,3]}).uniq

Book.joins(:authors).where('authors.id IN (?)', [1,3]).uniq 

Но я получаю книгу, чьи идентификаторы авторов 2,3,5, что не должно быть так, поскольку в ней нет author с идентификатором 1.

Итак, как я могу получить книги только с указанными идентификаторами авторов?

1 Ответ

0 голосов
/ 18 января 2019

Вам нужно предложение having в сочетании с предложением where:

ids = [1,3]
Book
  .select('books.*') # not sure if this is necessary
  .where(authors_books: { author_id: ids })
  .joins(:authors_books)
  .group('books.id')
  .having('count(authors_books) >= ?', ids.size)

SQL: https://www.db -fiddle.com / f / i7TXPJgavLwQCHb4GhgH3b / 0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...