Rails ActiveRecord присоединяется к запросу и включает в себя

У меня есть следующие модели

Видео принадлежит :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

person parameter    schedule 16.07.2015    source источник


Ответы (1)


Если я правильно понял ваш вопрос, было бы быстрее сделать это так?

RecipientList.limit(100).order("recipient_lists.created_at DESC").each do |recipient|
  @message = Message.find(recipient.message_id)
  @video = Video.find(@message.video_id)
  @video_activity = @video.video_activities.where(user_id: recipient.id)
end
person jkhaykin    schedule 19.07.2015