summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYorick Peterse <yorickpeterse@gmail.com>2016-06-21 11:25:44 +0000
committerYorick Peterse <yorickpeterse@gmail.com>2016-06-21 11:25:44 +0000
commit0468deafbd6fcf008eb672dd42b98390d95e8add (patch)
tree2d5e5340cc4d8c65bed826bc17c66ce898c733ef
parent0d287b06a6fa7a373df03378f9f1a048e5890a4f (diff)
parentbfce7349ea7c2efcbeb3fb34a207aad65d3129e3 (diff)
downloadgitlab-ce-0468deafbd6fcf008eb672dd42b98390d95e8add.tar.gz
Merge branch '18792-cache-participants-call' into 'master'
Cache Participable#participants in instance variable See merge request !4803
-rw-r--r--CHANGELOG1
-rw-r--r--app/models/concerns/participable.rb10
-rw-r--r--spec/models/concerns/participable_spec.rb10
3 files changed, 21 insertions, 0 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 2f42aa34990..fde2b11d3c9 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -136,6 +136,7 @@ v 8.9.0 (unreleased)
- Update tanuki logo highlight/loading colors
- Remove explicit Gitlab::Metrics.action assignments, are already automatic.
- Use Git cached counters for branches and tags on project page
+ - Cache participable participants in an instance variable.
- Filter parameters for request_uri value on instrumented transactions.
- Remove duplicated keys add UNIQUE index to keys fingerprint column
- ExtractsPath get ref_names from repository cache, if not there access git.
diff --git a/app/models/concerns/participable.rb b/app/models/concerns/participable.rb
index 9056722f45e..9822844357d 100644
--- a/app/models/concerns/participable.rb
+++ b/app/models/concerns/participable.rb
@@ -53,6 +53,16 @@ module Participable
#
# Returns an Array of User instances.
def participants(current_user = nil)
+ @participants ||= Hash.new do |hash, user|
+ hash[user] = raw_participants(user)
+ end
+
+ @participants[current_user]
+ end
+
+ private
+
+ def raw_participants(current_user = nil)
current_user ||= author
ext = Gitlab::ReferenceExtractor.new(project, current_user)
participants = Set.new
diff --git a/spec/models/concerns/participable_spec.rb b/spec/models/concerns/participable_spec.rb
index 7e4ea0f2d66..a9f4ef9ee5e 100644
--- a/spec/models/concerns/participable_spec.rb
+++ b/spec/models/concerns/participable_spec.rb
@@ -37,6 +37,16 @@ describe Participable, models: true do
expect(participants).to include(user3)
end
+ it 'caches the raw list of participants' do
+ instance = model.new
+ user1 = build(:user)
+
+ expect(instance).to receive(:raw_participants).once
+
+ instance.participants(user1)
+ instance.participants(user1)
+ end
+
it 'supports attributes returning another Participable' do
other_model = Class.new { include Participable }