N+1 queries in /projects/:id/boards API

This came out of https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/13052#note_180380372. If I add this spec:

diff --git a/spec/support/api/boards_shared_examples.rb b/spec/support/api/boards_shared_examples.rb
index 592962ebf7c..0d25639ac32 100644
--- a/spec/support/api/boards_shared_examples.rb
+++ b/spec/support/api/boards_shared_examples.rb
@@ -33,6 +33,18 @@ shared_examples_for 'group and project boards' do |route_definition, ee = false|
         expect_schema_match_for(response, 'public_api/v4/boards', ee)
       end

+      it 'avoids N+1 queries' do
+        pat = create(:personal_access_token, user: user)
+        get api(root_url, personal_access_token: pat)
+
+        control = ActiveRecord::QueryRecorder.new { get api(root_url, personal_access_token: pat) }
+
+        milestone = create(:milestone, project: board_parent)
+        create(:board, project: board_parent)
+
+        expect { get api(root_url, personal_access_token: pat) }.not_to exceed_query_limit(control)
+      end
+
       describe "GET #{route_definition}/:board_id" do
         let(:url) { "#{root_url}/#{board.id}" }

Then run:

bundle exec rspec --fail-fast spec/requests/api/boards_spec.rb

I get:

 1) API::Boards behaves like group and project boards GET /projects/:id/boards when authenticated avoids N+1 queries
     Failure/Error: expect { get api(root_url, personal_access_token: pat) }.not_to exceed_query_limit(control)

       Expected a maximum of 18 queries, got 21:

       Extra queries:

       [1] SELECT "lists".* FROM "lists" WHERE "lists"."board_id" = 4 AND "lists"."list_type" IN (1, 3, 4) ORDER BY "lists"."list_type" ASC, "lists"."position" ASC

       [1] SELECT  "users".* FROM "users" INNER JOIN "board_assignees" ON "users"."id" = "board_assignees"."assignee_id" WHERE "board_assignees"."board_id" = 4 LIMIT 1

       [1] SELECT "labels".* FROM "labels" INNER JOIN "board_labels" ON "labels"."id" = "board_labels"."label_id" WHERE "board_labels"."board_id" = 4 ORDER BY "labels"."title" ASC
     Shared Example Group: "group and project boards" called from ./spec/requests/api/boards_spec.rb:34
     # ./spec/support/api/boards_shared_examples.rb:45:in `block (4 levels) in <main>'

/cc: @cablett

Assignee Loading
Time tracking Loading