【问题标题】:rails activerecord query joins vs includesrails activerecord 查询连接与包含
【发布时间】:2015-07-16 00:17:06
【问题描述】:

我有以下型号

视频属于_to :customer 消息属于 :video, :customer, has_many :recipients through :recipient_list RecipientList belongs_to :recipient, :message VideoActivity belongs_to :video, :message, :recipient

我需要对客户的最后 100 个收件人列表进行查询,这些列表从与其关联的消息的列、与该消息关联的视频以及与该消息和收件人关联的视频活动中获取值。

我目前有这个丑陋的查询,但想知道加快它的最佳方法是什么。从视频开始,然后 .include 消息、video_activities 和收件人列表会更好吗?对于拥有大量视频的用户来说,这需要很长时间。

@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

【问题讨论】:

    标签: ruby-on-rails join activerecord include


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多