summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYorick Peterse <yorickpeterse@gmail.com>2016-06-15 15:22:05 +0200
committerYorick Peterse <yorickpeterse@gmail.com>2016-06-15 17:24:39 +0200
commita8638a7836db073144938ddbf71f93a03b4cd183 (patch)
treef65164feec14330465aafd0ee7b844cb5d233341
parenta4a85c269a4f3165914915ede4a9a7642057d105 (diff)
downloadgitlab-ce-group-owners-association.tar.gz
Turn Group#owners into a has_many associationgroup-owners-association
This allows the owners to be eager loaded where needed.
-rw-r--r--app/models/group.rb10
-rw-r--r--spec/models/group_spec.rb12
2 files changed, 18 insertions, 4 deletions
diff --git a/app/models/group.rb b/app/models/group.rb
index b8dffe9f5b9..e66e04371b2 100644
--- a/app/models/group.rb
+++ b/app/models/group.rb
@@ -9,6 +9,12 @@ class Group < Namespace
has_many :group_members, dependent: :destroy, as: :source, class_name: 'GroupMember'
alias_method :members, :group_members
has_many :users, -> { where(members: { requested_at: nil }) }, through: :group_members
+
+ has_many :owners,
+ -> { where(members: { access_level: Gitlab::Access::OWNER }) },
+ through: :group_members,
+ source: :user
+
has_many :project_group_links, dependent: :destroy
has_many :shared_projects, through: :project_group_links, source: :project
has_many :notification_settings, dependent: :destroy, as: :source
@@ -88,10 +94,6 @@ class Group < Namespace
end
end
- def owners
- @owners ||= group_members.owners.includes(:user).map(&:user)
- end
-
def add_users(user_ids, access_level, current_user = nil)
user_ids.each do |user_id|
Member.add_user(self.group_members, user_id, access_level, current_user)
diff --git a/spec/models/group_spec.rb b/spec/models/group_spec.rb
index ccdcb29f773..a2bdb344ba0 100644
--- a/spec/models/group_spec.rb
+++ b/spec/models/group_spec.rb
@@ -158,6 +158,18 @@ describe Group, models: true do
it { expect(group.has_master?(@members[:requester])).to be_falsey }
end
+ describe '#owners' do
+ let(:user1) { create(:user) }
+ let(:user2) { create(:user) }
+
+ it 'returns the owners of a Group' do
+ group.add_user(user1, Gitlab::Access::OWNER)
+ group.add_user(user2, Gitlab::Access::DEVELOPER)
+
+ expect(group.owners).to eq([user1])
+ end
+ end
+
def setup_group_members(group)
members = {
owner: create(:user),