Учитывая приведенную выше таблицу и модель для таблицы 'Stt' (Стандартный термин Term_year)
def test_the_ticket
rows = [
{standard_id: 1, term_id: 200, term_year_id: 300},
{standard_id: 2, term_id: 200, term_year_id: 300},
{standard_id: 2, term_id: 201, term_year_id: 301},
{standard_id: 3, term_id: 202, term_year_id: 300}
]
Stt.create! rows
results = Stt.select(:standard_id, 'array_agg(term_year_id) as term_year_ids').group('standard_id').having('NOT array_agg(term_year_id) @> Array[301]')
assert_equal([1,3], results.map(&:standard_id))
end
Возможно, есть лучший / лучший способ, но это подойдет.
Stt Load (1.8ms) SELECT "stts"."standard_id", array_agg(term_year_id) as term_year_ids FROM "stts" GROUP BY "stts"."standard_id" HAVING (NOT array_agg(term_year_id) @> Array[301])