deep_pluck 0.1.2 → 0.1.3
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 +6 -4
- data/lib/deep_pluck/model.rb +20 -13
- data/lib/deep_pluck/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: b2fc03be65ab872d226258b31d8ae589f3fbcd5a
|
4
|
+
data.tar.gz: e9509aff8cb651ac9f5cdc6589df4a392c1da44e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 23ac49792df4c092022648f7a7ae8bc1ca90f27f6bb743b29ed5f7648c1048ff20d41f6697e1bda4c12f87f59e5b122a515c409c3bade3d233f3a32fa2c4e156
|
7
|
+
data.tar.gz: 4a470d307b03034676d5b16fdd2da2a13c52258e1403c6313e156ef58201f72e2f705679c35d8a98fe9ab711d9ad4273adf7c2e9b2a3767049460755fd6e28b5
|
data/README.md
CHANGED
@@ -6,7 +6,9 @@
|
|
6
6
|
[](https://codeclimate.com/github/khiav223577/deep_pluck)
|
7
7
|
[](https://codeclimate.com/github/khiav223577/deep_pluck/coverage)
|
8
8
|
|
9
|
-
|
9
|
+
Allow you to pluck deeply into nested associations without loading a bunch of records.
|
10
|
+
|
11
|
+
And DRY up your code when using #as_json.
|
10
12
|
|
11
13
|
|
12
14
|
## Installation
|
@@ -36,12 +38,12 @@ User.deep_pluck(:id, :name)
|
|
36
38
|
|
37
39
|
### Pluck deep into associations
|
38
40
|
```rb
|
39
|
-
User.deep_pluck(:name,
|
41
|
+
User.deep_pluck(:name, :posts => :title)
|
40
42
|
# SELECT `users`.`id`, `users`.`name` FROM `users`
|
41
43
|
# SELECT `posts`.`user_id`, `posts`.`title` FROM `posts` WHERE `posts`.`user_id` IN (1, 2)
|
42
44
|
# => [
|
43
|
-
# {'name' => 'David' ,
|
44
|
-
# {'name' => 'Jeremy',
|
45
|
+
# {'name' => 'David' , :posts => [{'title' => 'post1'}, {'title' => 'post2'}]},
|
46
|
+
# {'name' => 'Jeremy', :posts => [{'title' => 'post3'}]}
|
45
47
|
# ]
|
46
48
|
```
|
47
49
|
|
data/lib/deep_pluck/model.rb
CHANGED
@@ -17,17 +17,23 @@ module DeepPluck
|
|
17
17
|
@relation.klass.reflect_on_association(association_key.to_sym) || #add to_sym since rails 3 only support symbol
|
18
18
|
raise(ActiveRecord::ConfigurationError, "ActiveRecord::ConfigurationError: Association named '#{association_key}' was not found on #{@relation.klass.name}; perhaps you misspelled it?")
|
19
19
|
end
|
20
|
+
def get_join_table(reflect, bool_flag = false)
|
21
|
+
return reflect.options[:through] if reflect.options[:through]
|
22
|
+
return (reflect.options[:join_table] || reflect.send(:derive_join_table)) if reflect.macro == :has_and_belongs_to_many
|
23
|
+
return
|
24
|
+
end
|
25
|
+
def get_primary_key(reflect)
|
26
|
+
return (reflect.belongs_to? ? reflect.klass : reflect.active_record).primary_key
|
27
|
+
end
|
20
28
|
def get_foreign_key(reflect, reverse: false, with_table_name: false)
|
21
|
-
if
|
22
|
-
|
23
|
-
table_name = chain_reflect.table_name
|
24
|
-
key = chain_reflect.foreign_key
|
29
|
+
if reverse and (table_name = get_join_table(reflect)) #reverse = parent
|
30
|
+
key = reflect.chain.last.foreign_key
|
25
31
|
else
|
26
|
-
return (reflect.belongs_to? ? reflect
|
32
|
+
return (reflect.belongs_to? ? get_primary_key(reflect) : reflect.foreign_key).to_s if reverse
|
27
33
|
table_name = reflect.active_record.table_name
|
28
|
-
key = (reflect.belongs_to? ? reflect.foreign_key : reflect
|
34
|
+
key = (reflect.belongs_to? ? reflect.foreign_key : get_primary_key(reflect))
|
29
35
|
end
|
30
|
-
return key if !with_table_name
|
36
|
+
return key.to_s if !with_table_name #key may be symbol if specify foreign_key in association options
|
31
37
|
return "#{table_name}.#{key}"
|
32
38
|
end
|
33
39
|
#---------------------------------------
|
@@ -60,30 +66,31 @@ module DeepPluck
|
|
60
66
|
#---------------------------------------
|
61
67
|
private
|
62
68
|
def do_query(parent, reflect, relation)
|
63
|
-
relation = relation.joins(reflect.options[:through]) if reflect.options[:through]
|
64
69
|
parent_key = get_foreign_key(reflect)
|
65
70
|
relation_key = get_foreign_key(reflect, reverse: true, with_table_name: true)
|
66
71
|
ids = parent.map{|s| s[parent_key]}
|
67
72
|
ids.uniq!
|
68
73
|
ids.compact!
|
69
|
-
return relation.where(relation_key => ids)
|
74
|
+
return relation.joins(get_join_table(reflect)).where(relation_key => ids)
|
70
75
|
end
|
71
76
|
private
|
72
77
|
def set_includes_data(parent, children_store_name, model)
|
73
78
|
reflect = get_reflect(children_store_name)
|
79
|
+
primary_key = get_primary_key(reflect)
|
74
80
|
if reflect.belongs_to? #Child.where(:id => parent.pluck(:child_id))
|
75
81
|
children = model.load_data{|relation| do_query(parent, reflect, relation) }
|
76
|
-
children_hash = children.map{|s| [s[
|
82
|
+
children_hash = children.map{|s| [s[primary_key], s]}.to_h
|
83
|
+
foreign_key = get_foreign_key(reflect)
|
77
84
|
parent.each{|s|
|
78
|
-
next if (id = s[
|
85
|
+
next if (id = s[foreign_key]) == nil
|
79
86
|
s[children_store_name] = children_hash[id]
|
80
87
|
}
|
81
88
|
else #Child.where(:parent_id => parent.pluck(:id))
|
82
89
|
parent_hash = {}
|
83
90
|
parent.each do |model_hash|
|
84
|
-
key = model_hash[
|
91
|
+
key = model_hash[primary_key]
|
85
92
|
if reflect.collection?
|
86
|
-
array = (parent_hash[key] ? parent_hash[key][children_store_name] : []) #
|
93
|
+
array = (parent_hash[key] ? parent_hash[key][children_store_name] : []) #share the children if id is duplicated
|
87
94
|
model_hash[children_store_name] = array
|
88
95
|
end
|
89
96
|
parent_hash[key] = model_hash
|
data/lib/deep_pluck/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: deep_pluck
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- khiav reoy
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-03-
|
11
|
+
date: 2017-03-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|