From 52119104b94f30d751b410ea865891258e1444ff Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 21 Nov 2016 15:16:04 +0100 Subject: [PATCH] Remove some n+1 queries from notifications API --- app/controllers/api/v1/notifications_controller.rb | 2 ++ app/models/notification.rb | 6 +++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/app/controllers/api/v1/notifications_controller.rb b/app/controllers/api/v1/notifications_controller.rb index 509471f61..63abee6b5 100644 --- a/app/controllers/api/v1/notifications_controller.rb +++ b/app/controllers/api/v1/notifications_controller.rb @@ -9,6 +9,8 @@ class Api::V1::NotificationsController < ApiController def index @notifications = Notification.where(account: current_account).with_includes.paginate_by_max_id(20, params[:max_id], params[:since_id]) + set_maps(@notifications.select { |n| !n.target_status.nil? }.map(&:target_status)) + next_path = api_v1_notifications_url(max_id: @notifications.last.id) if @notifications.size == 20 prev_path = api_v1_notifications_url(since_id: @notifications.first.id) unless @notifications.empty? diff --git a/app/models/notification.rb b/app/models/notification.rb index 66aefcb74..419f31230 100644 --- a/app/models/notification.rb +++ b/app/models/notification.rb @@ -11,10 +11,14 @@ class Notification < ApplicationRecord belongs_to :follow, foreign_type: 'Follow', foreign_key: 'activity_id' belongs_to :favourite, foreign_type: 'Favourite', foreign_key: 'activity_id' - STATUS_INCLUDES = [:account, :media_attachments, mentions: :account, reblog: [:account, mentions: :account]].freeze + STATUS_INCLUDES = [:account, :stream_entry, :media_attachments, :tags, mentions: :account, reblog: [:stream_entry, :account, :media_attachments, :tags, mentions: :account]].freeze scope :with_includes, -> { includes(status: STATUS_INCLUDES, mention: [status: STATUS_INCLUDES], favourite: [:account, status: STATUS_INCLUDES], follow: :account) } + def activity + send(activity_type.downcase) + end + def type case activity_type when 'Status'