summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2017-01-05 14:43:50 +0200
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2017-01-13 10:05:02 -0500
commit51c4b20c48f29fe34fd1306f7a115f645eb9fb71 (patch)
tree645824aae9ec7fb73bf6be8496f2a3710804ffff /app
parent4b43126d08972c201551fbd1fe42e85847d5e03f (diff)
downloadgitlab-ce-51c4b20c48f29fe34fd1306f7a115f645eb9fb71.tar.gz
Refactor Namespace code related to nested groups
Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Diffstat (limited to 'app')
-rw-r--r--app/helpers/groups_helper.rb2
-rw-r--r--app/models/group.rb2
-rw-r--r--app/models/namespace.rb22
-rw-r--r--app/models/route.rb4
4 files changed, 24 insertions, 6 deletions
diff --git a/app/helpers/groups_helper.rb b/app/helpers/groups_helper.rb
index 77dc9e7d538..926c9703628 100644
--- a/app/helpers/groups_helper.rb
+++ b/app/helpers/groups_helper.rb
@@ -14,7 +14,7 @@ module GroupsHelper
def group_title(group, name = nil, url = nil)
full_title = ''
- group.parents.each do |parent|
+ group.ancestors.each do |parent|
full_title += link_to(simple_sanitize(parent.name), group_path(parent))
full_title += ' / '.html_safe
end
diff --git a/app/models/group.rb b/app/models/group.rb
index 99675ddb366..4cdfd022094 100644
--- a/app/models/group.rb
+++ b/app/models/group.rb
@@ -201,7 +201,7 @@ class Group < Namespace
end
def members_with_parents
- GroupMember.where(requested_at: nil, source_id: parents.map(&:id).push(id))
+ GroupMember.where(requested_at: nil, source_id: ancestors.map(&:id).push(id))
end
def users_with_parents
diff --git a/app/models/namespace.rb b/app/models/namespace.rb
index d41833de66f..d3a4ddbb3bf 100644
--- a/app/models/namespace.rb
+++ b/app/models/namespace.rb
@@ -183,8 +183,26 @@ class Namespace < ActiveRecord::Base
end
end
- def parents
- @parents ||= parent ? parent.parents + [parent] : []
+ # Scopes the model on ancestors of the record
+ def ancestors
+ if parent_id
+ path = route.path
+ paths = []
+
+ until path.blank?
+ path = path.rpartition('/').first
+ paths << path
+ end
+
+ self.class.joins(:route).where('routes.path IN (?)', paths).order_id_asc
+ else
+ self.class.none
+ end
+ end
+
+ # Scopes the model on direct and indirect children of the record
+ def descendants
+ self.class.joins(:route).where('routes.path LIKE ?', "#{route.path}/%").order_id_asc
end
private
diff --git a/app/models/route.rb b/app/models/route.rb
index caf596efa79..ebd18dce737 100644
--- a/app/models/route.rb
+++ b/app/models/route.rb
@@ -8,9 +8,9 @@ class Route < ActiveRecord::Base
presence: true,
uniqueness: { case_sensitive: false }
- after_update :rename_children, if: :path_changed?
+ after_update :rename_descendants, if: :path_changed?
- def rename_children
+ def rename_descendants
# We update each row separately because MySQL does not have regexp_replace.
# rubocop:disable Rails/FindEach
Route.where('path LIKE ?', "#{path_was}/%").each do |route|