deep_pluck 0.1.1 → 0.1.2
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 +65 -0
- data/lib/deep_pluck/model.rb +16 -4
- data/lib/deep_pluck/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 51c4e3a56a22aaf35ded1d2614e87d76f5b52283
|
4
|
+
data.tar.gz: 5638b67af223f0c2c34009abdcfa7d7fe75c1186
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 76a4685fbe45190c0da0c75175dcc0769da3a43007be9791bf78f06208cf701534f997f946b72f095916cda4e8971bf1583de2758166a6ded366849d2c1dd814
|
7
|
+
data.tar.gz: 57c237f957442f8b04c915808f1f3e58491000e78ec0aae54a312dd8c2d9f051886269fcc6e323dfaa942c42b5cb8c12afe88a447405d4ba483f90e12fd99b2b
|
data/README.md
CHANGED
@@ -27,6 +27,71 @@ Or install it yourself as:
|
|
27
27
|
|
28
28
|
## Usage
|
29
29
|
|
30
|
+
### Similar to #pluck method
|
31
|
+
```rb
|
32
|
+
User.deep_pluck(:id, :name)
|
33
|
+
# SELECT `users`.`id`, `users`.`name` FROM `users`
|
34
|
+
# => [{'id' => 1, 'name' => 'David'}, {'id' => 2, 'name' => 'Jeremy'}]
|
35
|
+
```
|
36
|
+
|
37
|
+
### Pluck deep into associations
|
38
|
+
```rb
|
39
|
+
User.deep_pluck(:name, 'posts' => :title)
|
40
|
+
# SELECT `users`.`id`, `users`.`name` FROM `users`
|
41
|
+
# SELECT `posts`.`user_id`, `posts`.`title` FROM `posts` WHERE `posts`.`user_id` IN (1, 2)
|
42
|
+
# => [
|
43
|
+
# {'name' => 'David' , 'posts' => [{'title' => 'post1'}, {'title' => 'post2'}]},
|
44
|
+
# {'name' => 'Jeremy', 'posts' => [{'title' => 'post3'}]}
|
45
|
+
# ]
|
46
|
+
```
|
47
|
+
|
48
|
+
### DRY up Rails/ActiveRecord includes when using as_json
|
49
|
+
|
50
|
+
Assume the following relations:
|
51
|
+
|
52
|
+
> User has_many Posts.<br>
|
53
|
+
> Post has_many PostComments.<br>
|
54
|
+
> User has_one Contact.<br>
|
55
|
+
|
56
|
+
And the following #as_json example:
|
57
|
+
```rb
|
58
|
+
User.where(:name => %w(Pearl Kathenrie)).includes([{:posts => :post_comments}, :contact]).as_json({
|
59
|
+
:root => false,
|
60
|
+
:only => [:name, :email],
|
61
|
+
:include => {
|
62
|
+
'posts' => {
|
63
|
+
:only => :name,
|
64
|
+
:include => {
|
65
|
+
'post_comments' => {
|
66
|
+
:only => :comment,
|
67
|
+
},
|
68
|
+
},
|
69
|
+
},
|
70
|
+
'contact' => {
|
71
|
+
:only => :address,
|
72
|
+
},
|
73
|
+
},
|
74
|
+
})
|
75
|
+
|
76
|
+
```
|
77
|
+
You could refactor it with #deep_pluck like:
|
78
|
+
```rb
|
79
|
+
User.where(:name => %w(Pearl Kathenrie)).deep_pluck(
|
80
|
+
:name,
|
81
|
+
:email,
|
82
|
+
'posts' => [:name, 'post_comments' => :comment],
|
83
|
+
'contact' => :address,
|
84
|
+
)
|
85
|
+
```
|
86
|
+
|
87
|
+
### Better Performance
|
88
|
+
|
89
|
+
#deep_pluck return raw hash data without loading a bunch of records.
|
90
|
+
|
91
|
+
In that faster than #as_json, or #select.
|
92
|
+
|
93
|
+
Will add some benchmarks soon :)
|
94
|
+
|
30
95
|
|
31
96
|
## Development
|
32
97
|
|
data/lib/deep_pluck/model.rb
CHANGED
@@ -14,7 +14,8 @@ module DeepPluck
|
|
14
14
|
# Reader
|
15
15
|
#---------------------------------------
|
16
16
|
def get_reflect(association_key)
|
17
|
-
@relation.klass.reflect_on_association(association_key.to_sym) #add to_sym since rails 3 only support symbol
|
17
|
+
@relation.klass.reflect_on_association(association_key.to_sym) || #add to_sym since rails 3 only support symbol
|
18
|
+
raise(ActiveRecord::ConfigurationError, "ActiveRecord::ConfigurationError: Association named '#{association_key}' was not found on #{@relation.klass.name}; perhaps you misspelled it?")
|
18
19
|
end
|
19
20
|
def get_foreign_key(reflect, reverse: false, with_table_name: false)
|
20
21
|
if reflect.options[:through] and reverse #reverse = parent
|
@@ -104,12 +105,12 @@ module DeepPluck
|
|
104
105
|
def load_data
|
105
106
|
prev_need_columns = @parent_model.get_foreign_key(@parent_model.get_reflect(@parent_association_key), reverse: true, with_table_name: true) if @parent_model
|
106
107
|
next_need_columns = @associations.map{|key, _| get_foreign_key(get_reflect(key), with_table_name: true) }.uniq
|
107
|
-
all_need_columns = [*prev_need_columns, *next_need_columns, *@need_columns].uniq
|
108
|
+
all_need_columns = [*prev_need_columns, *next_need_columns, *@need_columns].uniq(&Helper::TO_KEY_PROC)
|
108
109
|
@relation = yield(@relation) if block_given?
|
109
110
|
@data = @relation.pluck_all(*all_need_columns)
|
110
111
|
if @data.size != 0
|
111
|
-
|
112
|
-
@extra_columns.map
|
112
|
+
#for delete_extra_column_data!
|
113
|
+
@extra_columns = all_need_columns.map(&Helper::TO_KEY_PROC) - @need_columns.map(&Helper::TO_KEY_PROC)
|
113
114
|
@associations.each do |key, model|
|
114
115
|
set_includes_data(@data, key, model)
|
115
116
|
end
|
@@ -126,5 +127,16 @@ module DeepPluck
|
|
126
127
|
@data.each{|s| s.except!(*@extra_columns) }
|
127
128
|
@associations.each{|_, model| model.delete_extra_column_data! }
|
128
129
|
end
|
130
|
+
#---------------------------------------
|
131
|
+
# Helper methods
|
132
|
+
#---------------------------------------
|
133
|
+
module Helper
|
134
|
+
TO_KEY_PROC = proc{|s| Helper.column_to_key(s) }
|
135
|
+
def self.column_to_key(key) #user_achievements.user_id => user_id
|
136
|
+
key = key[/(\w+)[^\w]*\z/]
|
137
|
+
key.gsub!(/[^\w]+/, '')
|
138
|
+
return key
|
139
|
+
end
|
140
|
+
end
|
129
141
|
end
|
130
142
|
end
|
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.2
|
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-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -138,7 +138,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
138
138
|
version: '0'
|
139
139
|
requirements: []
|
140
140
|
rubyforge_project:
|
141
|
-
rubygems_version: 2.
|
141
|
+
rubygems_version: 2.6.8
|
142
142
|
signing_key:
|
143
143
|
specification_version: 4
|
144
144
|
summary: Use deep_pluck as a shortcut to select one or more attributes and include
|