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
|
@ -154,6 +154,11 @@ class Member < ActiveRecord::Base
|
||||||
def add_users(source, users, 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?
|
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
|
self.transaction do
|
||||||
users.map do |user|
|
users.map do |user|
|
||||||
add_user(
|
add_user(
|
||||||
|
|
|
@ -390,13 +390,15 @@ describe Member, models: true do
|
||||||
%w[project group].each do |source_type|
|
%w[project group].each do |source_type|
|
||||||
context "when source is a #{source_type}" do
|
context "when source is a #{source_type}" do
|
||||||
let!(:source) { create(source_type, :public, :access_requestable) }
|
let!(:source) { create(source_type, :public, :access_requestable) }
|
||||||
let!(:user) { create(:user) }
|
|
||||||
let!(:admin) { create(:admin) }
|
let!(:admin) { create(:admin) }
|
||||||
|
let(:user1) { create(:user) }
|
||||||
|
let(:user2) { create(:user) }
|
||||||
|
|
||||||
it 'returns a <Source>Member objects' do
|
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).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_a "#{source_type.classify}Member".constantize
|
||||||
expect(members.first).to be_persisted
|
expect(members.first).to be_persisted
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue