mirror of
https://github.com/discourse/discourse.git
synced 2025-05-24 14:12:10 +08:00
PERF: Eager load Theme associations in Stylesheet Manager.
Before this change, calling `StyleSheet::Manager.stylesheet_details` for the first time resulted in multiple queries to the database. This is because the code was modelled in a way where each `Theme` was loaded from the database one at a time. This PR restructures the code such that it allows us to load all the theme records in a single query. It also allows us to eager load the required associations upfront. In order to achieve this, I removed the support of loading multiple themes per request. It was initially added to support user selectable theme components but the feature was never completed and abandoned because it wasn't a feature that we thought was worth building.
This commit is contained in:
36
spec/components/scss_checker_spec.rb
Normal file
36
spec/components/scss_checker_spec.rb
Normal file
@ -0,0 +1,36 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require 'rails_helper'
|
||||
|
||||
describe Stylesheet::Manager::ScssChecker do
|
||||
fab!(:theme) { Fabricate(:theme) }
|
||||
|
||||
describe '#has_scss' do
|
||||
it 'should return true when theme has scss' do
|
||||
scss_theme = Fabricate(:theme, component: true)
|
||||
scss_theme.set_field(target: :common, name: "scss", value: ".scss{color: red;}")
|
||||
scss_theme.save!
|
||||
|
||||
embedded_scss_theme = Fabricate(:theme, component: true)
|
||||
embedded_scss_theme.set_field(target: :common, name: "embedded_scss", value: ".scss{color: red;}")
|
||||
embedded_scss_theme.save!
|
||||
|
||||
theme_ids = [scss_theme.id, embedded_scss_theme.id]
|
||||
|
||||
desktop_theme_checker = described_class.new(:desktop_theme, theme_ids)
|
||||
|
||||
expect(desktop_theme_checker.has_scss(scss_theme.id)).to eq(true)
|
||||
expect(desktop_theme_checker.has_scss(embedded_scss_theme.id)).to eq(false)
|
||||
|
||||
embedded_theme_checker = described_class.new(:embedded_theme, theme_ids)
|
||||
|
||||
expect(embedded_theme_checker.has_scss(scss_theme.id)).to eq(false)
|
||||
expect(embedded_theme_checker.has_scss(embedded_scss_theme.id)).to eq(true)
|
||||
end
|
||||
|
||||
it 'should return false when theme does not have scss' do
|
||||
expect(described_class.new(:desktop_theme, [theme.id]).has_scss(theme.id))
|
||||
.to eq(false)
|
||||
end
|
||||
end
|
||||
end
|
Reference in New Issue
Block a user