treeify 0.03 → 0.04
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/treeify.rb +51 -24
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6e46207f75973096a118eccdbae623ae2ec680ae
|
4
|
+
data.tar.gz: 1fa74c1913e7981730e487b72dc57761286e9937
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 87e4847de85128b0bf240f3147a389900b1e4e4049bed54bbe7ed61f6f44a1be2cfabb0bcc8e334012f9a71f5c69a507f3bc3737b55ece9f2830226378d4417f
|
7
|
+
data.tar.gz: dc8c693c76af128d049cbcfb1b11838b39884e2969afa61d2737c7b885222d82d60e8f179b4c1627397bc532820d333dfbc8e2956d2fa7b90b036399929fc5ae
|
data/lib/treeify.rb
CHANGED
@@ -1,10 +1,15 @@
|
|
1
1
|
require 'active_record'
|
2
|
+
require 'pp'
|
2
3
|
require "active_support/concern"
|
3
4
|
require "active_support/core_ext/module/attribute_accessors"
|
4
5
|
require "active_support/core_ext/class/attribute"
|
5
6
|
|
6
7
|
module Treeify
|
7
|
-
extend ActiveSupport::Concern
|
8
|
+
extend ActiveSupport::Concern
|
9
|
+
|
10
|
+
cattr_writer :cols do
|
11
|
+
[]
|
12
|
+
end
|
8
13
|
|
9
14
|
included do
|
10
15
|
has_many :children,
|
@@ -13,30 +18,61 @@ module Treeify
|
|
13
18
|
belongs_to :parent,
|
14
19
|
class_name: self,
|
15
20
|
foreign_key: "parent_id"
|
21
|
+
|
16
22
|
class_attribute :cols
|
17
23
|
scope :roots, -> { where(parent_id: nil) }
|
18
|
-
scope :tree_for, ->(instance) {
|
19
|
-
scope :tree_for_ancestors, ->(instance) {
|
24
|
+
scope :tree_for, ->(instance) { self.find_by_sql self.tree_sql_for(instance) }
|
25
|
+
scope :tree_for_ancestors, ->(instance) { self.find_by_sql self.tree_sql_for_ancestors(instance) }
|
20
26
|
end
|
21
27
|
|
22
28
|
module ClassMethods
|
29
|
+
|
30
|
+
def tree_config(hash = {})
|
31
|
+
self.cols = !hash[:cols].nil? == true ? hash[:cols] : []
|
32
|
+
end
|
33
|
+
|
34
|
+
def columns_joined(char=",")
|
35
|
+
self.cols ||= []
|
36
|
+
self.cols.join(char)
|
37
|
+
end
|
23
38
|
|
24
|
-
def
|
25
|
-
|
26
|
-
self.cols
|
39
|
+
def columns_with_table_name
|
40
|
+
self.cols ||= []
|
41
|
+
self.cols.map{|c|
|
42
|
+
c = "#{table_name}.#{c}"
|
43
|
+
}.join(",")
|
44
|
+
end
|
45
|
+
|
46
|
+
def has_config_defined_cols?
|
47
|
+
#return true if self.respond_to?("cols") && !self.cols.nil?
|
48
|
+
if self.respond_to?("cols")
|
49
|
+
return !self.cols.empty? if !self.cols.nil?
|
50
|
+
end
|
51
|
+
false
|
52
|
+
end
|
53
|
+
|
54
|
+
# sort of hacky, but check to see if we have any columns defined in the config
|
55
|
+
# if we do, return the string of columns, formatted appropriately
|
56
|
+
# otherwise, just return an empty string
|
57
|
+
def appropriate_column_listing(columns = columns_joined)
|
58
|
+
has_config_defined_cols? == true ? ", #{columns}" : ""
|
27
59
|
end
|
28
60
|
|
29
61
|
def tree_sql(instance)
|
30
|
-
"
|
62
|
+
cte_params = has_config_defined_cols? ? "id, parent_id, path, #{columns_joined}" : "id, parent_id, path"
|
63
|
+
|
64
|
+
"WITH RECURSIVE cte (#{cte_params}) AS (
|
31
65
|
SELECT id,
|
32
|
-
|
66
|
+
parent_id,
|
67
|
+
array[id] AS path#{appropriate_column_listing}
|
33
68
|
FROM #{table_name}
|
34
69
|
WHERE id = #{instance.id}
|
35
70
|
|
36
71
|
UNION ALL
|
37
72
|
|
38
73
|
SELECT #{table_name}.id,
|
39
|
-
|
74
|
+
#{table_name}.parent_id,
|
75
|
+
cte.path || #{table_name}.id#{appropriate_column_listing(columns_with_table_name)}
|
40
76
|
FROM #{table_name}
|
41
77
|
JOIN cte ON #{table_name}.parent_id = cte.id
|
42
78
|
)"
|
@@ -44,25 +80,14 @@ module Treeify
|
|
44
80
|
|
45
81
|
def tree_sql_for(instance)
|
46
82
|
"#{tree_sql(instance)}
|
47
|
-
SELECT
|
83
|
+
SELECT * FROM cte
|
48
84
|
ORDER BY path"
|
49
85
|
end
|
50
86
|
|
51
87
|
def tree_sql_for_ancestors(instance)
|
52
|
-
"
|
53
|
-
|
54
|
-
|
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
|
-
)
|
65
|
-
SELECT cte.id FROM cte WHERE cte.id != #{instance.id}"
|
88
|
+
"#{tree_sql(instance)}
|
89
|
+
SELECT * FROM cte
|
90
|
+
WHERE cte.id != #{instance.id}"
|
66
91
|
end
|
67
92
|
end
|
68
93
|
|
@@ -111,4 +136,6 @@ module Treeify
|
|
111
136
|
nested_hash.has_key? item['parent_id']
|
112
137
|
}.values
|
113
138
|
end
|
139
|
+
|
140
|
+
|
114
141
|
end
|