diff --git a/app/models/ci/stage.rb b/app/models/ci/stage.rb
index ca76d82f358367e255c1ee8e84c37d8386503fd9..ca74c91b0627b5861e8052b0c94c31a081c22ee1 100644
--- a/app/models/ci/stage.rb
+++ b/app/models/ci/stage.rb
@@ -46,7 +46,11 @@ module Ci
     end
 
     def has_warnings?
-      @warnings ||= statuses.latest.failed_but_allowed.any?
+      if @warnings.nil?
+        statuses.latest.failed_but_allowed.any?
+      else
+        @warnings
+      end
     end
   end
 end
diff --git a/spec/models/ci/stage_spec.rb b/spec/models/ci/stage_spec.rb
index cca0cb1e3b00905f0db947cab50afdab2db42af7..c4a9743a4e245b8d6acd96ed61d652d5a2fac15e 100644
--- a/spec/models/ci/stage_spec.rb
+++ b/spec/models/ci/stage_spec.rb
@@ -169,10 +169,22 @@ describe Ci::Stage, models: true do
   describe '#has_warnings?' do
     context 'when stage has warnings' do
       context 'when using memoized warnings flag' do
-        let(:stage) { build(:ci_stage, warnings: true) }
+        context 'when there are warnings' do
+          let(:stage) { build(:ci_stage, warnings: true) }
 
-        it 'has warnings' do
-          expect(stage).to have_warnings
+          it 'has memoized warnings' do
+            expect(stage).not_to receive(:statuses)
+            expect(stage).to have_warnings
+          end
+        end
+
+        context 'when there are no warnings' do
+          let(:stage) { build(:ci_stage, warnings: false) }
+
+          it 'has memoized warnings' do
+            expect(stage).not_to receive(:statuses)
+            expect(stage).not_to have_warnings
+          end
         end
       end
 
@@ -182,7 +194,8 @@ describe Ci::Stage, models: true do
                  stage: stage_name, pipeline: pipeline)
         end
 
-        it 'has warnings' do
+        it 'has warnings calculated from statuses' do
+          expect(stage).to receive(:statuses).and_call_original
           expect(stage).to have_warnings
         end
       end
@@ -194,7 +207,8 @@ describe Ci::Stage, models: true do
                                     pipeline: pipeline)
       end
 
-      it 'does not have warnings' do
+      it 'does not have warnings calculated from statuses' do
+        expect(stage).to receive(:statuses).and_call_original
         expect(stage).not_to have_warnings
       end
     end