У меня есть следующие модели
Видео принадлежит :customer Сообщение принадлежит :video, :customer, has_many :recipients через :recipient_list RecipientList created_to :recipient, :message
Мне нужно сделать запрос к последним 100 спискам получателей клиента, который получает значения из столбцов сообщения, к которому оно привязано, видео, которое привязано к этому сообщению, и действия с видео, которые привязаны к этому сообщению и получателю.
В настоящее время у меня есть этот уродливый запрос, но мне было интересно, как лучше всего его ускорить. Не лучше ли начать с видео, а затем включать сообщения, видео_действия и списки получателей? Это занимает очень много времени для пользователя, у которого много видео.
@videos = RecipientList.select("recipient_lists.*,
COALESCE(sum(video_activities.duration_in_seconds),0) AS video_watched_duration_in_seconds,
COALESCE(SUM(video_activities.video_watched_count),0) AS video_views,
COALESCE(SUM(video_activities.response_count),0) AS responses,
COALESCE(SUM(video_activities.email_opened_count),0) AS email_opens,
CASE WHEN COUNT(video_activities.id) = 0 THEN 0 ELSE 1 END AS has_activity,
MAX(video_activities.updated_at) AS last_activity,
MAX(video_activities.email_opened_at) AS last_opened,
MAX(video_activities.video_watched_at) AS last_watched,
MAX(video_activities.responded_at) AS last_responded")
.joins("LEFT JOIN messages ON 52 = messages.customer_id
LEFT JOIN videos ON (messages.video_id = videos.id AND videos.template = false)
LEFT JOIN video_activities ON (videos.id = video_activities.video_id AND messages.id = video_activities.message_id AND recipient_lists.recipient_id = video_activities.recipient_id)")
.group("recipient_lists.id")
.where("messages.customer_id = 52")
.order("recipient_lists.created_at DESC")
.limit(100)
.load