• Sean McGivern's avatar
    Fix N+1 for notification recipients on private projects · 28e6af88
    Sean McGivern authored
    If we don't call #to_a, we're relying on the members already being loaded from
    elsewhere. Otherwise we'll do a separate query for each user:
    
        [1] pry(main)> Project.first.team.members.include?(User.first)
          Project Load (0.7ms)  SELECT  "projects".* FROM "projects"  ORDER BY "projects"."id" ASC LIMIT 1
          ↳ (pry):3
          User Load (1.8ms)  SELECT  "users".* FROM "users"  ORDER BY "users"."id" ASC LIMIT 1
          ↳ (pry):3
          User Exists (0.6ms)  SELECT  1 AS one FROM "users" INNER JOIN "project_authorizations" ON "users"."id" = "project_authorizations"."user_id" WHERE "project_authorizations"."project_id" = $1 AND "users"."id" = $2 LIMIT 1  [["project_id", 1], ["id", 1]]
          ↳ (pry):3
        => true
        [2] pry(main)> Project.first.team.members.to_a.include?(User.first)
          Project Load (12.8ms)  SELECT  "projects".* FROM "projects"  ORDER BY "projects"."id" ASC LIMIT 1
          ↳ (pry):1
          User Load (9.6ms)  SELECT "users".* FROM "users" INNER JOIN "project_authorizations" ON "users"."id" = "project_authorizations"."user_id" WHERE "project_authorizations"."project_id" = $1  [["project_id", 1]]
          ↳ (pry):1
          User Load (0.6ms)  SELECT  "users".* FROM "users"  ORDER BY "users"."id" ASC LIMIT 1
          ↳ (pry):1
        => true
    28e6af88