mirror of
https://github.com/discourse/discourse.git
synced 2025-02-20 11:48:26 -06:00
PERF: optimise serialization for topic tracking state (#20860)
This corrects two issues: 1. We were double serializing topic tracking state (as_json calls were not cached) 2. We were inefficiently serializing items by instantiating extra objects
This commit is contained in:
parent
d8ad5c38b9
commit
49f0cc16ba
@ -653,8 +653,10 @@ class ApplicationController < ActionController::Base
|
|||||||
report = TopicTrackingState.report(current_user)
|
report = TopicTrackingState.report(current_user)
|
||||||
serializer = TopicTrackingStateSerializer.new(report, scope: guardian, root: false)
|
serializer = TopicTrackingStateSerializer.new(report, scope: guardian, root: false)
|
||||||
|
|
||||||
store_preloaded("topicTrackingStates", MultiJson.dump(serializer.as_json[:data]))
|
hash = serializer.as_json
|
||||||
store_preloaded("topicTrackingStateMeta", MultiJson.dump(serializer.as_json[:meta]))
|
|
||||||
|
store_preloaded("topicTrackingStates", MultiJson.dump(hash[:data]))
|
||||||
|
store_preloaded("topicTrackingStateMeta", MultiJson.dump(hash[:meta]))
|
||||||
end
|
end
|
||||||
|
|
||||||
def custom_html_json
|
def custom_html_json
|
||||||
|
@ -28,4 +28,8 @@ class TopicTrackingStateItemSerializer < ApplicationSerializer
|
|||||||
def include_is_category_topic?
|
def include_is_category_topic?
|
||||||
object.respond_to?(:category_topic_id)
|
object.respond_to?(:category_topic_id)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def object=(value)
|
||||||
|
@object = value
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
@ -4,8 +4,12 @@ class TopicTrackingStateSerializer < ApplicationSerializer
|
|||||||
attributes :data, :meta
|
attributes :data, :meta
|
||||||
|
|
||||||
def data
|
def data
|
||||||
|
serializer = TopicTrackingStateItemSerializer.new(nil, scope: scope, root: false)
|
||||||
|
# note we may have 1000 rows, avoiding serializer instansitation saves significant time
|
||||||
|
# for 1000 rows this takes it down from 10ms to 3ms on a reasonably fast machine
|
||||||
object.map do |item|
|
object.map do |item|
|
||||||
TopicTrackingStateItemSerializer.new(item, scope: scope, root: false).as_json
|
serializer.object = item
|
||||||
|
serializer.as_json
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user