From 6a82a69352bc9f2079cc15ebadb200a6145307aa Mon Sep 17 00:00:00 2001 From: fdegier <fdegier@gitlab.com> Date: Fri, 28 Feb 2025 13:45:55 +0100 Subject: [PATCH] Model: Improve performance of with_version_count scope Changelog: performance --- app/models/ml/model.rb | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/app/models/ml/model.rb b/app/models/ml/model.rb index 9c6e6248730e9..d187f732574bf 100644 --- a/app/models/ml/model.rb +++ b/app/models/ml/model.rb @@ -30,9 +30,12 @@ class Model < ApplicationRecord scope :including_latest_version, -> { includes(:latest_version) } scope :including_project, -> { includes(:project) } scope :with_version_count, -> { - left_outer_joins(:versions) - .select("ml_models.*, count(ml_model_versions.id) as version_count") - .group(:id) + version_counts = Ml::ModelVersion + .select(:model_id, 'COUNT(*) as count') + .group(:model_id) + + joins("LEFT OUTER JOIN (#{version_counts.to_sql}) as version_counts ON version_counts.model_id = ml_models.id") + .select('ml_models.*, COALESCE(version_counts.count, 0) as version_count') } scope :by_name, ->(name) { where("ml_models.name LIKE ?", "%#{sanitize_sql_like(name)}%") } # rubocop:disable GitlabSecurity/SqlInjection scope :by_project, ->(project) { where(project_id: project.id) } -- GitLab