diff --git a/app/models/concerns/localizable_order_by_slug_scope.rb b/app/models/concerns/localizable_order_by_slug_scope.rb new file mode 100644 index 0000000000000000000000000000000000000000..815740a53219fadb9fbe424667e6369f173a2727 --- /dev/null +++ b/app/models/concerns/localizable_order_by_slug_scope.rb @@ -0,0 +1,29 @@ +module LocalizableOrderBySlugScope + extend ActiveSupport::Concern + + # Cf LocalizableOrderByNameScope + included do + scope :ordered, -> (language) { + localization_name_select = <<-SQL + COALESCE( + MAX(CASE WHEN localizations.language_id = '#{language.id}' THEN TRIM(LOWER(UNACCENT(localizations.slug))) END), + MAX(TRIM(LOWER(UNACCENT(localizations.slug)))) FILTER (WHERE localizations.rank = 1) + ) AS localization_slug + SQL + + joins(sanitize_sql_array([<<-SQL + LEFT JOIN ( + SELECT + localizations.*, + ROW_NUMBER() OVER(PARTITION BY localizations.about_id ORDER BY localizations.created_at ASC) as rank + FROM + #{table_name.singularize}_localizations as localizations + ) localizations ON #{table_name}.id = localizations.about_id + SQL + ])) + .select("#{table_name}.*", localization_name_select) + .group("#{table_name}.id") + .order("localization_slug ASC") + } + end +end diff --git a/app/models/education/program.rb b/app/models/education/program.rb index e8ea74a3f05a2699d97b8e237b4e70bf91f6bf6c..6201137514e25fe88cd30caa48fefe965ab435d5 100644 --- a/app/models/education/program.rb +++ b/app/models/education/program.rb @@ -30,7 +30,7 @@ class Education::Program < ApplicationRecord include AsIndirectObject include Filterable include Localizable - include LocalizableOrderByNameScope + include LocalizableOrderBySlugScope include Sanitizable include WebsitesLinkable include WithAlumni