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.
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