From e8058bd23100949607ac8c353f482067c0ecd25a Mon Sep 17 00:00:00 2001
From: Sean McGivern <sean@gitlab.com>
Date: Mon, 16 May 2016 10:23:21 +0100
Subject: [PATCH] Return a relation with Postgres

Postgres only needs to select a single column, so that can used as a
sub-query where `Milestone.upcoming_ids_by_projects` is actually used in
`IssuableFinder`.

MySQL needs to select the `due_date` column because it's used in the
`HAVING` clause, so it has to return an array of IDs.
---
 app/models/milestone.rb       | 2 +-
 spec/models/milestone_spec.rb | 4 +++-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/app/models/milestone.rb b/app/models/milestone.rb
index 6b01e48d7fc..fe9a281f366 100644
--- a/app/models/milestone.rb
+++ b/app/models/milestone.rb
@@ -71,7 +71,7 @@ class Milestone < ActiveRecord::Base
     rel = unscoped.of_projects(projects).active.where('due_date > ?', Time.now)
 
     if Gitlab::Database.postgresql?
-      rel.order(:project_id, :due_date).pluck('DISTINCT ON (project_id) id')
+      rel.order(:project_id, :due_date).select('DISTINCT ON (project_id) id')
     else
       rel.
         group(:project_id).
diff --git a/spec/models/milestone_spec.rb b/spec/models/milestone_spec.rb
index 210c5f7eb4f..1e18c788b50 100644
--- a/spec/models/milestone_spec.rb
+++ b/spec/models/milestone_spec.rb
@@ -221,7 +221,9 @@ describe Milestone, models: true do
 
     let!(:past_milestone_project_3) { create(:milestone, project: project_3, due_date: Time.now - 1.day) }
 
-    let(:milestone_ids) { Milestone.upcoming_ids_by_projects(projects) }
+    # The call to `#try` is because this returns a relation with a Postgres DB,
+    # and an array of IDs with a MySQL DB.
+    let(:milestone_ids) { Milestone.upcoming_ids_by_projects(projects).map { |id| id.try(:id) || id } }
 
     it 'returns the next upcoming open milestone ID for each project' do
       expect(milestone_ids).to contain_exactly(current_milestone_project_1.id, current_milestone_project_2.id)
-- 
GitLab