Rails 5 Active Record - запрос, который определяет, существует ли запись родного брата - PullRequest
0 голосов
/ 27 января 2019

Программное обеспечение, которое я создаю, помогает планировать события и связываться с людьми для участия в мероприятиях.Мы хотим идентифицировать всех пользователей, которых мы еще не пригласили на конкретное событие, с помощью PhoneCall.Для этого мы хотим запросить:

1) Все пользователи, для которых нет ContactAttempt для какого-либо события

2) Пользователи, для которых нет ContactAttempt с event_id = это событие.идентификатор и этот предпринятый_тип = PhoneCall.(это захватывает тех, с кем мы связались через Text, но не PhoneCall)

User.includes(:contact_attempts).references(:contact_attempts)
.where('contact_attempts.id IS NULL OR (contact_attempts.event_id = ? AND contact_attempts.attempted_type != ?)', @event.id, "PhoneCall")

Но этот запрос исключает третью группу пользователей, на которых я хочу ориентироваться, которых я не смогвключить в запрос:

Users, у которого есть ContactAttempt для другого event_id, но не для этого event_id.Сначала я думал, что это можно сделать с помощью contact_attempts.event_id != ?, но это включало всех пользователей, у которых был существующий ContactAttempt , даже если с ними связались для этого event_id ,

Как я могупостроить запрос так, чтобы он также был нацелен на всех пользователей, у которых нет ContactAttempt для этого конкретного события с пытанием_типа = PhoneCall, но может быть ContactAttempt для предыдущего события?

Требуется ли для этого Arel?

1 Ответ

0 голосов
/ 30 мая 2019
User.joins('LEFT OUTER JOIN contact_attempts 
            ON contact_attempts.user_id = users.id')
    .where('contact_attempts.id IS NULL 
            OR (contact_attempts.event_id = ?
            AND contact_attempts.attempted_type != ?)',
            @event.id, "PhoneCall")

Я думаю, что проблема с включениями и ссылками заключается в том, что пользователи не получат без ассоциации, тогда как при левом соединении вернутся пользователи как с попытками контакта, так и без него

...