mirror of
https://github.com/discourse/discourse.git
synced 2025-03-29 11:35:45 +08:00
Merge pull request #4294 from tgxworld/fix_n+1_queries
PERF: Remove N+1 queries on user messages page.
This commit is contained in:
commit
7a6b9a953e
@ -293,13 +293,15 @@ class ApplicationController < ActionController::Base
|
|||||||
Middleware::AnonymousCache.anon_cache(request.env, time_length)
|
Middleware::AnonymousCache.anon_cache(request.env, time_length)
|
||||||
end
|
end
|
||||||
|
|
||||||
def fetch_user_from_params(opts=nil)
|
def fetch_user_from_params(opts=nil, eager_load = [])
|
||||||
opts ||= {}
|
opts ||= {}
|
||||||
user = if params[:username]
|
user = if params[:username]
|
||||||
username_lower = params[:username].downcase.chomp('.json')
|
username_lower = params[:username].downcase.chomp('.json')
|
||||||
find_opts = { username_lower: username_lower }
|
find_opts = { username_lower: username_lower }
|
||||||
find_opts[:active] = true unless opts[:include_inactive] || current_user.try(:staff?)
|
find_opts[:active] = true unless opts[:include_inactive] || current_user.try(:staff?)
|
||||||
User.find_by(find_opts)
|
result = User
|
||||||
|
(result = result.includes(*eager_load)) if !eager_load.empty?
|
||||||
|
result.find_by(find_opts)
|
||||||
elsif params[:external_id]
|
elsif params[:external_id]
|
||||||
external_id = params[:external_id].chomp('.json')
|
external_id = params[:external_id].chomp('.json')
|
||||||
SingleSignOnRecord.find_by(external_id: external_id).try(:user)
|
SingleSignOnRecord.find_by(external_id: external_id).try(:user)
|
||||||
|
@ -109,7 +109,7 @@ class ListController < ApplicationController
|
|||||||
[:topics_by, :private_messages, :private_messages_sent, :private_messages_unread, :private_messages_archive, :private_messages_group, :private_messages_group_archive].each do |action|
|
[:topics_by, :private_messages, :private_messages_sent, :private_messages_unread, :private_messages_archive, :private_messages_group, :private_messages_group_archive].each do |action|
|
||||||
define_method("#{action}") do
|
define_method("#{action}") do
|
||||||
list_opts = build_topic_list_options
|
list_opts = build_topic_list_options
|
||||||
target_user = fetch_user_from_params(include_inactive: current_user.try(:staff?))
|
target_user = fetch_user_from_params({ include_inactive: current_user.try(:staff?) }, [:user_stat, :user_option])
|
||||||
guardian.ensure_can_see_private_messages!(target_user.id) unless action == :topics_by
|
guardian.ensure_can_see_private_messages!(target_user.id) unless action == :topics_by
|
||||||
list = generate_list_for(action.to_s, target_user, list_opts)
|
list = generate_list_for(action.to_s, target_user, list_opts)
|
||||||
url_prefix = "topics" unless action == :topics_by
|
url_prefix = "topics" unless action == :topics_by
|
||||||
|
@ -67,6 +67,7 @@ class TopicListItemSerializer < ListableTopicSerializer
|
|||||||
def include_tags?
|
def include_tags?
|
||||||
SiteSetting.tagging_enabled
|
SiteSetting.tagging_enabled
|
||||||
end
|
end
|
||||||
|
|
||||||
def tags
|
def tags
|
||||||
object.tags.map(&:name)
|
object.tags.map(&:name)
|
||||||
end
|
end
|
||||||
|
@ -26,6 +26,7 @@ class TopicListSerializer < ApplicationSerializer
|
|||||||
def include_tags?
|
def include_tags?
|
||||||
SiteSetting.tagging_enabled && SiteSetting.show_filter_by_tag
|
SiteSetting.tagging_enabled && SiteSetting.show_filter_by_tag
|
||||||
end
|
end
|
||||||
|
|
||||||
def tags
|
def tags
|
||||||
Tag.top_tags
|
Tag.top_tags
|
||||||
end
|
end
|
||||||
|
@ -355,10 +355,10 @@ class TopicQuery
|
|||||||
options = @options
|
options = @options
|
||||||
options.reverse_merge!(per_page: per_page_setting)
|
options.reverse_merge!(per_page: per_page_setting)
|
||||||
|
|
||||||
result = Topic
|
result = Topic.includes(:tags)
|
||||||
|
|
||||||
if type == :group
|
if type == :group
|
||||||
result = result.includes(:allowed_groups)
|
result = result.includes(:allowed_users)
|
||||||
result = result.where("topics.id IN (SELECT topic_id FROM topic_allowed_groups
|
result = result.where("topics.id IN (SELECT topic_id FROM topic_allowed_groups
|
||||||
WHERE group_id IN (
|
WHERE group_id IN (
|
||||||
SELECT group_id FROM group_users WHERE user_id = #{user.id.to_i}) AND
|
SELECT group_id FROM group_users WHERE user_id = #{user.id.to_i}) AND
|
||||||
|
Loading…
x
Reference in New Issue
Block a user