Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'app/models/concerns/subquery.rb')
-rw-r--r--app/models/concerns/subquery.rb24
1 files changed, 24 insertions, 0 deletions
diff --git a/app/models/concerns/subquery.rb b/app/models/concerns/subquery.rb
new file mode 100644
index 00000000000..ae92d2137c1
--- /dev/null
+++ b/app/models/concerns/subquery.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+# Distinguish between a top level query and a subselect.
+#
+# Retrieve column values when the relation has already been loaded, otherwise reselect the relation.
+# Useful for preload query patterns where the typical Rails #preload does not fit. Such as:
+#
+# projects = Project.where(...)
+# projects.load
+# ...
+# options[members] = ProjectMember.where(...).where(source_id: projects.select(:id))
+module Subquery
+ extend ActiveSupport::Concern
+
+ class_methods do
+ def subquery(*column_names, max_limit: 5_000)
+ if current_scope.loaded? && current_scope.size <= max_limit
+ current_scope.pluck(*column_names)
+ else
+ current_scope.reselect(*column_names)
+ end
+ end
+ end
+end