treeify 0.02 → 0.03
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/treeify.rb +53 -1
- metadata +75 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 422fe3f0d572c4b67db08dd518122b2d0a04262f
|
4
|
+
data.tar.gz: bb8044d5cc0267c3f80ad7709f337bd04b826218
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7a88024c53a98ffd0ca89ac1d7ce643425ded66d3fda586b3655f94ab10367f82ea47c32bd8f6aac2726b46e60c461aa4ed120cacdf491cee3f83471077333be
|
7
|
+
data.tar.gz: bd3020aa3d4f182547acd64ba07cd91e54f587ad1fae9655b4dea19f938b85fd16d8ed76c0a70172b4abc884c6a2a78d49152f79c9cd699353186ca9442dcfb0
|
data/lib/treeify.rb
CHANGED
@@ -7,6 +7,12 @@ module Treeify
|
|
7
7
|
extend ActiveSupport::Concern
|
8
8
|
|
9
9
|
included do
|
10
|
+
has_many :children,
|
11
|
+
class_name: self,
|
12
|
+
foreign_key: "parent_id"
|
13
|
+
belongs_to :parent,
|
14
|
+
class_name: self,
|
15
|
+
foreign_key: "parent_id"
|
10
16
|
class_attribute :cols
|
11
17
|
scope :roots, -> { where(parent_id: nil) }
|
12
18
|
scope :tree_for, ->(instance) { where("#{table_name}.id IN (#{tree_sql_for(instance)})").order("#{table_name}.id") }
|
@@ -43,7 +49,19 @@ module Treeify
|
|
43
49
|
end
|
44
50
|
|
45
51
|
def tree_sql_for_ancestors(instance)
|
46
|
-
"
|
52
|
+
"WITH RECURSIVE cte (id, path) AS (
|
53
|
+
SELECT id,
|
54
|
+
array[id] AS path
|
55
|
+
FROM #{table_name}
|
56
|
+
WHERE id = #{instance.id}
|
57
|
+
|
58
|
+
UNION ALL
|
59
|
+
|
60
|
+
SELECT #{table_name}.id,
|
61
|
+
cte.path || #{table_name}.id
|
62
|
+
FROM #{table_name}
|
63
|
+
JOIN cte ON #{table_name}.parent_id = cte.id
|
64
|
+
)
|
47
65
|
SELECT cte.id FROM cte WHERE cte.id != #{instance.id}"
|
48
66
|
end
|
49
67
|
end
|
@@ -59,4 +77,38 @@ module Treeify
|
|
59
77
|
def self_and_descendents
|
60
78
|
self.class.tree_for(self)
|
61
79
|
end
|
80
|
+
|
81
|
+
def is_root?
|
82
|
+
self.parent_id != nil
|
83
|
+
end
|
84
|
+
|
85
|
+
def siblings
|
86
|
+
self.class.where(parent_id: self.parent_id) - [self]
|
87
|
+
end
|
88
|
+
|
89
|
+
def descendent_tree
|
90
|
+
# give build_tree an array of hashes with the AR objects serialized into a hash
|
91
|
+
build_tree(descendents.to_a.map(&:serializable_hash))
|
92
|
+
end
|
93
|
+
|
94
|
+
def build_tree(data)
|
95
|
+
# turn our AoH into a hash where we've mapped the ID column
|
96
|
+
# to the rest of the hash + a comments array for nested comments
|
97
|
+
nested_hash = Hash[data.map{|e| [e['id'], e.merge('children' => [])]}]
|
98
|
+
|
99
|
+
# if we have a parent ID, grab all the comments
|
100
|
+
# associated with that parent and push them into the comments array
|
101
|
+
nested_hash.each do |id, item|
|
102
|
+
parent = nested_hash[item['parent_id']]
|
103
|
+
parent['children'] << item if parent
|
104
|
+
end
|
105
|
+
|
106
|
+
# return the values of our nested hash, ie our actual comment hash data
|
107
|
+
# reject any descendents whose parent ID already exists in the main hash so we don't
|
108
|
+
# get orphaned descendents listed as their own comment
|
109
|
+
|
110
|
+
nested_hash.reject{|id, item|
|
111
|
+
nested_hash.has_key? item['parent_id']
|
112
|
+
}.values
|
113
|
+
end
|
62
114
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: treeify
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.03'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Devin Austin
|
@@ -9,7 +9,77 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
date: 2014-06-11 00:00:00.000000000 Z
|
12
|
-
dependencies:
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: pg
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.17.1
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.17.1
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: activerecord
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 4.1.6
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 4.1.6
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 3.1.0
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 3.1.0
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rake
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 10.3.2
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 10.3.2
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: database_cleaner
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 1.3.0
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 1.3.0
|
13
83
|
description: Simple trees for ActiveRecord
|
14
84
|
email: devin.austin@gmail.com
|
15
85
|
executables: []
|
@@ -27,17 +97,17 @@ require_paths:
|
|
27
97
|
- lib
|
28
98
|
required_ruby_version: !ruby/object:Gem::Requirement
|
29
99
|
requirements:
|
30
|
-
- -
|
100
|
+
- - ">="
|
31
101
|
- !ruby/object:Gem::Version
|
32
102
|
version: '0'
|
33
103
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
34
104
|
requirements:
|
35
|
-
- -
|
105
|
+
- - ">="
|
36
106
|
- !ruby/object:Gem::Version
|
37
107
|
version: '0'
|
38
108
|
requirements: []
|
39
109
|
rubyforge_project:
|
40
|
-
rubygems_version: 2.
|
110
|
+
rubygems_version: 2.2.2
|
41
111
|
signing_key:
|
42
112
|
specification_version: 4
|
43
113
|
summary: Simple trees for ActiveRecord using PostgreSQL
|