Задача легко решается простым SQL.Предполагая, что вы используете PostgreSQL 9+, это SQL-запрос для получения идентификаторов счетов, которые соответствуют вашему условию (имеют ТОЧНО ценовые матрицы только с идентификаторами [1, 2]):
SELECT I.id
FROM invoices I
JOIN entries E ON E.invoice_id = I.id
GROUP BY I.id
HAVING array_agg(E.price_matrix_id ORDER BY E.price_matrix_id ASC) = ARRAY[1,2];
Здесь мы присоединяемся invoices
и entries
, группировать результаты по invoice.id
и фильтровать только те из них, которые дали price_matrix_ids
.Обратите внимание, что выражение ARRAY[1,2]
должно содержать price_matrix_ids
, отсортированное в порядке возрастания.
Демонстрация в сети: http://rextester.com/TAEUU9220
Возвращаясь к Ruby, приведем код:
price_matrix_ids = [1,2].sort
Invoice.joins(:entries).having("array_agg(entries.price_matrix_id ORDER BY entries.price_matrix_id ASC) = ARRAY[#{price_matrix_ids.join(',')}]").group('invoices.id')