ancestry 3.0.4 → 3.0.5
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/README.md +5 -0
- data/lib/ancestry/has_ancestry.rb +1 -0
- data/lib/ancestry/instance_methods.rb +22 -3
- data/lib/ancestry/materialized_path.rb +12 -0
- data/lib/ancestry/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 441841ddcb84e00cdc685fe6bfc4ba8db2a184ae
|
4
|
+
data.tar.gz: d860eef74743307b1fae929ec652f8ec77474a10
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a75b3aceafbe2a286feff48f0bb8ec1fe4618ad45b80d24ee7c400fdedfcde0144dad477aeae119d7709861068237cd4c12a5d41429b3c7ff6f667b8da47c71f
|
7
|
+
data.tar.gz: a1abe3c0d18f3bddb7bf531a7a1a46d5f53a954da1eba0a46741f00b8f0aa4baae7802a172c676ed65afc1b843aea8fe4a7cdc6669241777f31debc8e4025d70
|
data/README.md
CHANGED
@@ -118,6 +118,8 @@ To navigate an Ancestry model, use the following instance methods:
|
|
118
118
|
|`is_only_child?` <br/> `only_child?` |true if the record is the only child of its parent|
|
119
119
|
|`descendants` |direct and indirect children of the record|
|
120
120
|
|`descendant_ids` |direct and indirect children's ids of the record|
|
121
|
+
|`indirects` |indirect children of the record|
|
122
|
+
|`indirect_ids` |indirect children's ids of the record|
|
121
123
|
|`subtree` |the model on descendants and itself|
|
122
124
|
|`subtree_ids` |a list of all ids in the record's subtree|
|
123
125
|
|`depth` |the depth of the node, root nodes are at depth 0|
|
@@ -133,6 +135,8 @@ There are also instance methods to determine the relationship between 2 nodes:
|
|
133
135
|
|`root_of?(node)` | node's root is this record|
|
134
136
|
|`ancestor_of?(node)`| node's ancestors include this record|
|
135
137
|
|`child_of?(node)` | node is record's parent|
|
138
|
+
|`descendant_of?(node)` | node is one of this record's ancestors|
|
139
|
+
|`indirect_of?(node)` | node is one of this record's ancestors but not a parent|
|
136
140
|
|
137
141
|
# Options for `has_ancestry`
|
138
142
|
|
@@ -174,6 +178,7 @@ For convenience, a couple of named scopes are included at the class level:
|
|
174
178
|
ancestors_of(node) Ancestors of node, node can be either a record or an id
|
175
179
|
children_of(node) Children of node, node can be either a record or an id
|
176
180
|
descendants_of(node) Descendants of node, node can be either a record or an id
|
181
|
+
indirects_of(node) Indirect children of node, node can be either a record or an id
|
177
182
|
subtree_of(node) Subtree of node, node can be either a record or an id
|
178
183
|
siblings_of(node) Siblings of node, node can be either a record or an id
|
179
184
|
|
@@ -41,6 +41,7 @@ module Ancestry
|
|
41
41
|
scope :roots, lambda { where(root_conditions) }
|
42
42
|
scope :ancestors_of, lambda { |object| where(ancestor_conditions(object)) }
|
43
43
|
scope :children_of, lambda { |object| where(child_conditions(object)) }
|
44
|
+
scope :indirects_of, lambda { |object| where(indirect_conditions(object)) }
|
44
45
|
scope :descendants_of, lambda { |object| where(descendant_conditions(object)) }
|
45
46
|
scope :subtree_of, lambda { |object| where(subtree_conditions(object)) }
|
46
47
|
scope :siblings_of, lambda { |object| where(sibling_conditions(object)) }
|
@@ -275,6 +275,24 @@ module Ancestry
|
|
275
275
|
ancestor_ids.include?(node.id)
|
276
276
|
end
|
277
277
|
|
278
|
+
# Indirects
|
279
|
+
|
280
|
+
def indirect_conditions
|
281
|
+
self.ancestry_base_class.indirect_conditions(self)
|
282
|
+
end
|
283
|
+
|
284
|
+
def indirects depth_options = {}
|
285
|
+
self.ancestry_base_class.ordered_by_ancestry.scope_depth(depth_options, depth).where indirect_conditions
|
286
|
+
end
|
287
|
+
|
288
|
+
def indirect_ids depth_options = {}
|
289
|
+
indirects(depth_options).pluck(self.ancestry_base_class.primary_key)
|
290
|
+
end
|
291
|
+
|
292
|
+
def indirect_of?(node)
|
293
|
+
ancestor_ids[0..-2].include?(node.id)
|
294
|
+
end
|
295
|
+
|
278
296
|
# Subtree
|
279
297
|
|
280
298
|
def subtree_conditions
|
@@ -302,11 +320,12 @@ module Ancestry
|
|
302
320
|
end
|
303
321
|
|
304
322
|
private
|
323
|
+
ANCESTRY_DELIMITER = '/'.freeze
|
305
324
|
|
306
325
|
def parse_ancestry_column obj
|
307
|
-
|
308
|
-
obj_ids.
|
309
|
-
obj_ids
|
326
|
+
return [] unless obj
|
327
|
+
obj_ids = obj.split(ANCESTRY_DELIMITER)
|
328
|
+
self.class.primary_key_is_an_integer? ? obj_ids.map!(&:to_i) : obj_ids
|
310
329
|
end
|
311
330
|
|
312
331
|
def unscoped_descendants
|
@@ -27,6 +27,18 @@ module Ancestry
|
|
27
27
|
t[ancestry_column].eq(node.child_ancestry)
|
28
28
|
end
|
29
29
|
|
30
|
+
# indirect = anyone who is a descendant, but not a child
|
31
|
+
def indirect_conditions(object)
|
32
|
+
t = arel_table
|
33
|
+
node = to_node(object)
|
34
|
+
# rails has case sensitive matching.
|
35
|
+
if ActiveRecord::VERSION::MAJOR >= 5
|
36
|
+
t[ancestry_column].matches("#{node.child_ancestry}/%", nil, true)
|
37
|
+
else
|
38
|
+
t[ancestry_column].matches("#{node.child_ancestry}/%")
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
30
42
|
def descendant_conditions(object)
|
31
43
|
t = arel_table
|
32
44
|
node = to_node(object)
|
data/lib/ancestry/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ancestry
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0.
|
4
|
+
version: 3.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stefan Kroes
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2018-11-
|
12
|
+
date: 2018-11-06 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activerecord
|