mirror of
https://github.com/discourse/discourse.git
synced 2024-11-27 00:43:38 +08:00
8e3691d537
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.
36 lines
829 B
Ruby
36 lines
829 B
Ruby
# frozen_string_literal: true
|
|
|
|
class Stylesheet::Manager::ScssChecker
|
|
def initialize(target, theme_ids)
|
|
@target = target.to_sym
|
|
@theme_ids = theme_ids
|
|
end
|
|
|
|
def has_scss(theme_id)
|
|
!!get_themes_with_scss[theme_id]
|
|
end
|
|
|
|
private
|
|
|
|
def get_themes_with_scss
|
|
@themes_with_scss ||= begin
|
|
theme_target = @target.to_sym
|
|
theme_target = :mobile if theme_target == :mobile_theme
|
|
theme_target = :desktop if theme_target == :desktop_theme
|
|
name = @target == :embedded_theme ? :embedded_scss : :scss
|
|
|
|
results = Theme
|
|
.where(id: @theme_ids)
|
|
.left_joins(:theme_fields)
|
|
.where(theme_fields: {
|
|
target_id: [Theme.targets[theme_target], Theme.targets[:common]],
|
|
name: name
|
|
})
|
|
.group(:id)
|
|
.size
|
|
|
|
results
|
|
end
|
|
end
|
|
end
|