diff --git a/app/models/member.rb b/app/models/member.rb
index 97fba501759e95ff94b308974f97a04fdb7fcac6..7228e82e9781384bd6d232b5087d767dd774195a 100644
--- a/app/models/member.rb
+++ b/app/models/member.rb
@@ -154,6 +154,11 @@ def add_user(source, user, access_level, current_user: nil, expires_at: nil)
     def add_users(source, users, access_level, current_user: nil, expires_at: nil)
       return [] unless users.present?
 
+      # Collect all user ids into separate array
+      # so we can use single sql query to get user objects
+      user_ids = users.select { |user| user =~ /\A\d+\Z/ }
+      users = users - user_ids + User.where(id: user_ids)
+
       self.transaction do
         users.map do |user|
           add_user(
diff --git a/spec/models/member_spec.rb b/spec/models/member_spec.rb
index b0f3657d3b5fa769e63063df1ebf736ec4902739..ccc3deac199b0b17601a96ea8d861674cc37f3a6 100644
--- a/spec/models/member_spec.rb
+++ b/spec/models/member_spec.rb
@@ -390,13 +390,15 @@
     %w[project group].each do |source_type|
       context "when source is a #{source_type}" do
         let!(:source) { create(source_type, :public, :access_requestable) }
-        let!(:user) { create(:user) }
         let!(:admin) { create(:admin) }
+        let(:user1) { create(:user) }
+        let(:user2) { create(:user) }
 
         it 'returns a <Source>Member objects' do
-          members = described_class.add_users(source, [user], :master)
+          members = described_class.add_users(source, [user1, user2], :master)
 
           expect(members).to be_a Array
+          expect(members.size).to eq(2)
           expect(members.first).to be_a "#{source_type.classify}Member".constantize
           expect(members.first).to be_persisted
         end