treeify 0.02 → 0.03

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/treeify.rb +53 -1
  3. metadata +75 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4c05d601b25f5e493f430b1ae5354410f237ae90
4
- data.tar.gz: 28c555a605c4b17e542127398ea4feee6da00216
3
+ metadata.gz: 422fe3f0d572c4b67db08dd518122b2d0a04262f
4
+ data.tar.gz: bb8044d5cc0267c3f80ad7709f337bd04b826218
5
5
  SHA512:
6
- metadata.gz: eabf4eca128f87d7c3034021e40ddbb9ba752ee826be1a73a53552079a4dbac4516cd2df0cc60c96688f4de0030fe7002f1e3abd2b7211e17cf78d4bc318e786
7
- data.tar.gz: f2653463b3f9d161136447b3f827ff9105a0cb90e1cde341defe34c93028214323791c8ec272c87cd9e771e6c45b9e0d75e5c08a94fafc1ab262a86386f77208
6
+ metadata.gz: 7a88024c53a98ffd0ca89ac1d7ce643425ded66d3fda586b3655f94ab10367f82ea47c32bd8f6aac2726b46e60c461aa4ed120cacdf491cee3f83471077333be
7
+ data.tar.gz: bd3020aa3d4f182547acd64ba07cd91e54f587ad1fae9655b4dea19f938b85fd16d8ed76c0a70172b4abc884c6a2a78d49152f79c9cd699353186ca9442dcfb0
@@ -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
- "#{tree_sql(instance)}
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.02'
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.0.7
110
+ rubygems_version: 2.2.2
41
111
  signing_key:
42
112
  specification_version: 4
43
113
  summary: Simple trees for ActiveRecord using PostgreSQL