Collect all users by single query when using Member#add_users
Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
This commit is contained in:
parent
00e4ec55c3
commit
b8dc4c761d
2 changed files with 9 additions and 2 deletions
|
@ -154,6 +154,11 @@ class Member < ActiveRecord::Base
|
|||
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(
|
||||
|
|
|
@ -390,13 +390,15 @@ describe Member, models: true do
|
|||
%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
|
||||
|
|
Loading…
Reference in a new issue