diff --git a/app/models/commit_status.rb b/app/models/commit_status.rb
index 99622014662ac4b678b2b75f861e7cf9ea1577d4..ee3396abe045c919538bed02c91fe4c9f2631235 100644
--- a/app/models/commit_status.rb
+++ b/app/models/commit_status.rb
@@ -32,8 +32,8 @@ class CommitStatus < ActiveRecord::Base
   scope :exclude_ignored, -> do
     quoted_when = connection.quote_column_name('when')
     # We want to ignore failed_but_allowed jobs
-    where("allow_failure = ? OR status NOT IN (?)",
-      false, [:failed, :canceled]).
+    where("allow_failure = ? OR status IN (?)",
+      false, all_state_names - [:failed, :canceled]).
       # We want to ignore skipped manual jobs
       where("#{quoted_when} <> ? OR status <> ?", 'manual', 'skipped').
       # We want to ignore skipped on_failure
diff --git a/app/models/concerns/has_status.rb b/app/models/concerns/has_status.rb
index 2dd2c5f2c0ff59613f4b66a4b91b0089328a2965..9f64f76721d46463f29b3bb9b1b1a9109f83b378 100644
--- a/app/models/concerns/has_status.rb
+++ b/app/models/concerns/has_status.rb
@@ -43,6 +43,10 @@ module HasStatus
     def finished_at
       all.maximum(:finished_at)
     end
+
+    def all_state_names
+      state_machines.values.flat_map(&:states).flat_map { |s| s.map(&:name) }
+    end
   end
 
   included do