deep_pluck 1.1.0 → 1.1.1
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 +5 -5
- data/.travis.yml +1 -0
- data/CHANGELOG.md +43 -0
- data/README.md +43 -17
- data/gemfiles/3.2.gemfile +1 -1
- data/gemfiles/4.2.gemfile +1 -1
- data/gemfiles/5.0.gemfile +1 -1
- data/gemfiles/5.1.gemfile +1 -1
- data/gemfiles/5.2.gemfile +14 -0
- data/lib/deep_pluck.rb +3 -3
- data/lib/deep_pluck/model.rb +1 -1
- data/lib/deep_pluck/preloaded_model.rb +2 -0
- data/lib/deep_pluck/version.rb +1 -1
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: f546a72a6ba6196d025dab3228d9f7bdb96ceed1675c10d4bdb04f9fd7cbd047
|
4
|
+
data.tar.gz: 99b48a384f25ccf25b7996d9cfcfc8594a4dd9bbc41e71976481ede3e4b89e94
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 326f4d9c3af855a85e48935ddc25e26e59603a3b43fe1c5b5e7e5dcf7450dcbf33dea3208215c19c7da60d91e6b570d66cb266de7a4d84de2434b6412d09e830
|
7
|
+
data.tar.gz: 9239f528f10b466c00ce367da8d8a5eb546264627e179c37a80ad492d00a80cec3f2ae0168955c14a4625ea1d0a798daa9be24d9aab1a613f739c502ce08c28f
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
## Change Log
|
2
|
+
|
3
|
+
### [upcoming](https://github.com/khiav223577/deep_pluck/compare/v1.1.0...HEAD) 2018/04/05
|
4
|
+
- [#22](https://github.com/khiav223577/deep_pluck/pull/22) #deep_pluck at active model without plucking deeply will cause ArgumentError (@khiav223577)
|
5
|
+
- [#20](https://github.com/khiav223577/deep_pluck/pull/20) [ENHANCE] Eliminate Extra Select Loop in Hash Lookup (@berniechiu)
|
6
|
+
|
7
|
+
### [v1.1.0](https://github.com/khiav223577/deep_pluck/compare/v1.0.3...v1.1.0) 2018/02/15
|
8
|
+
- [#19](https://github.com/khiav223577/deep_pluck/pull/19) Support deep_pluck at active model (@khiav223577)
|
9
|
+
- [#18](https://github.com/khiav223577/deep_pluck/pull/18) Add rubocop and Improve code quality (@khiav223577)
|
10
|
+
|
11
|
+
### [v1.0.3](https://github.com/khiav223577/deep_pluck/compare/v1.0.0...v1.0.3) 2017/06/30
|
12
|
+
- [#15](https://github.com/khiav223577/deep_pluck/pull/15) test deep_pluck in rails 5.1.x (@khiav223577)
|
13
|
+
- [#14](https://github.com/khiav223577/deep_pluck/pull/14) Handle polymorphic associations correctly. (@Bogadon)
|
14
|
+
|
15
|
+
### [v1.0.0](https://github.com/khiav223577/deep_pluck/compare/v0.1.4...v1.0.0) 2017/03/28
|
16
|
+
- [#12](https://github.com/khiav223577/deep_pluck/pull/12) reduce cyclomatic complexity in model.rb (@khiav223577)
|
17
|
+
|
18
|
+
### [v0.1.4](https://github.com/khiav223577/deep_pluck/compare/v0.1.3...v0.1.4) 2017/03/27
|
19
|
+
- [#11](https://github.com/khiav223577/deep_pluck/pull/11) Fix conditional associations (@khiav223577)
|
20
|
+
|
21
|
+
### [v0.1.3](https://github.com/khiav223577/deep_pluck/compare/v0.1.2...v0.1.3) 2017/03/20
|
22
|
+
- [#10](https://github.com/khiav223577/deep_pluck/pull/10) fix custom foreign_key, custom primary_key issues (@khiav223577)
|
23
|
+
- [#9](https://github.com/khiav223577/deep_pluck/pull/9) fix has_and_belongs_to_many (@khiav223577)
|
24
|
+
|
25
|
+
### [v0.1.2](https://github.com/khiav223577/deep_pluck/compare/v0.1.1...v0.1.2) 2017/03/17
|
26
|
+
- [#8](https://github.com/khiav223577/deep_pluck/pull/8) fix some need columns is missing (@khiav223577)
|
27
|
+
- [#7](https://github.com/khiav223577/deep_pluck/pull/7) raise error message when association not found (@khiav223577)
|
28
|
+
|
29
|
+
### [v0.1.1](https://github.com/khiav223577/deep_pluck/compare/v0.1.0...v0.1.1) 2017/03/16
|
30
|
+
- [#6](https://github.com/khiav223577/deep_pluck/pull/6) fix deep_pluck with #joins (@khiav223577)
|
31
|
+
|
32
|
+
### [v0.1.0](https://github.com/khiav223577/deep_pluck/compare/v0.0.4...v0.1.0) 2017/03/15
|
33
|
+
- [#5](https://github.com/khiav223577/deep_pluck/pull/5) Support pluck many-to-many associations (@khiav223577)
|
34
|
+
|
35
|
+
### [v0.0.4](https://github.com/khiav223577/deep_pluck/compare/v0.0.3...v0.0.4) 2017/03/14
|
36
|
+
- [#4](https://github.com/khiav223577/deep_pluck/pull/4) Fix use deep_pluck on NullRelation will raise exception and prevent unneeded query. (@khiav223577)
|
37
|
+
|
38
|
+
### [v0.0.3](https://github.com/khiav223577/deep_pluck/compare/v0.0.2...v0.0.3) 2017/03/06
|
39
|
+
- [#3](https://github.com/khiav223577/deep_pluck/pull/3) support more than two level (@khiav223577)
|
40
|
+
|
41
|
+
### v0.0.2 2017/03/06
|
42
|
+
- [#2](https://github.com/khiav223577/deep_pluck/pull/2) The result of has_one association should not be array (@khiav223577)
|
43
|
+
- [#1](https://github.com/khiav223577/deep_pluck/pull/1) deep pluck (@khiav223577)
|
data/README.md
CHANGED
@@ -8,9 +8,7 @@
|
|
8
8
|
|
9
9
|
Allow you to pluck deeply into nested associations without loading a bunch of records.
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
Works in Rails 3+.
|
11
|
+
Support Rails 3.2, 4.2, 5.0, 5.1, 5.2.
|
14
12
|
|
15
13
|
|
16
14
|
## Installation
|
@@ -32,29 +30,57 @@ Or install it yourself as:
|
|
32
30
|
## Usage
|
33
31
|
|
34
32
|
### Similar to #pluck method
|
33
|
+
|
35
34
|
```rb
|
36
35
|
User.deep_pluck(:id, :name)
|
37
36
|
# SELECT `users`.`id`, `users`.`name` FROM `users`
|
38
|
-
# =>
|
37
|
+
# =>
|
38
|
+
# [
|
39
|
+
# {'id' => 1, 'name' => 'David'},
|
40
|
+
# {'id' => 2, 'name' => 'Jeremy'},
|
41
|
+
# ]
|
39
42
|
```
|
40
43
|
|
41
|
-
### Pluck
|
44
|
+
### Pluck attributes from nested associations
|
45
|
+
|
42
46
|
```rb
|
43
|
-
User.deep_pluck(:name,
|
47
|
+
User.deep_pluck(:name, 'posts' => :title)
|
44
48
|
# SELECT `users`.`id`, `users`.`name` FROM `users`
|
45
49
|
# SELECT `posts`.`user_id`, `posts`.`title` FROM `posts` WHERE `posts`.`user_id` IN (1, 2)
|
46
|
-
# =>
|
47
|
-
#
|
48
|
-
# {
|
50
|
+
# =>
|
51
|
+
# [
|
52
|
+
# {
|
53
|
+
# 'name' => 'David' ,
|
54
|
+
# 'posts' => [
|
55
|
+
# {'title' => 'post1'},
|
56
|
+
# {'title' => 'post2'},
|
57
|
+
# ],
|
58
|
+
# },
|
59
|
+
# {
|
60
|
+
# 'name' => 'Jeremy',
|
61
|
+
# 'posts' => [
|
62
|
+
# {'title' => 'post3'},
|
63
|
+
# ],
|
64
|
+
# },
|
49
65
|
# ]
|
50
66
|
```
|
51
|
-
|
67
|
+
|
68
|
+
### Pluck at models
|
69
|
+
|
52
70
|
```rb
|
53
|
-
user = User.find_by(name: 'David')
|
54
|
-
|
71
|
+
user = User.find_by(name: 'David')
|
72
|
+
user.deep_pluck(:name, :posts => :title)
|
73
|
+
# =>
|
74
|
+
# {
|
75
|
+
# 'name' => 'David' ,
|
76
|
+
# :posts => [
|
77
|
+
# {'title' => 'post1'},
|
78
|
+
# {'title' => 'post2'},
|
79
|
+
# ],
|
80
|
+
# }
|
55
81
|
```
|
56
82
|
|
57
|
-
###
|
83
|
+
### Compare with using `#as_json`
|
58
84
|
|
59
85
|
Assume the following relations:
|
60
86
|
|
@@ -85,7 +111,9 @@ User.where(:name => %w(Pearl Kathenrie)).includes([{:posts => :post_comments}, :
|
|
85
111
|
```
|
86
112
|
It works as expected, but is not very DRY, repeat writing `include`, `posts`, `post_comments` so many times.
|
87
113
|
|
88
|
-
|
114
|
+
Not to mention the huge performace improvement by using #deep_pluck.
|
115
|
+
|
116
|
+
You could refactor the example with #deep_pluck:
|
89
117
|
```rb
|
90
118
|
User.where(:name => %w(Pearl Kathenrie)).deep_pluck(
|
91
119
|
:name,
|
@@ -97,9 +125,7 @@ User.where(:name => %w(Pearl Kathenrie)).deep_pluck(
|
|
97
125
|
|
98
126
|
### Better Performance
|
99
127
|
|
100
|
-
#deep_pluck return raw hash data without loading a bunch of records.
|
101
|
-
|
102
|
-
In that faster than #as_json, or #select.
|
128
|
+
#deep_pluck return raw hash data without loading a bunch of records, so that faster than #as_json, or #select.
|
103
129
|
|
104
130
|
The following is the benchmark test on 3 users, 6 posts, where `users` table have 14 columns and `posts` have 6 columns. As it shows, `deep_pluck` is 4x faster than `as_json`.
|
105
131
|
|
data/gemfiles/3.2.gemfile
CHANGED
data/gemfiles/4.2.gemfile
CHANGED
data/gemfiles/5.0.gemfile
CHANGED
data/gemfiles/5.1.gemfile
CHANGED
@@ -0,0 +1,14 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
# Specify your gem's dependencies in pluck_all.gemspec
|
4
|
+
|
5
|
+
gem "activerecord", "~> 5.2.0"
|
6
|
+
gem "pluck_all", "~> 1.2.2"
|
7
|
+
|
8
|
+
group :test do
|
9
|
+
gem "simplecov"
|
10
|
+
gem "codeclimate-test-reporter", "~> 1.0.0"
|
11
|
+
end
|
12
|
+
|
13
|
+
gemspec :path => "../"
|
14
|
+
|
data/lib/deep_pluck.rb
CHANGED
@@ -15,10 +15,10 @@ class ActiveRecord::Base
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def deep_pluck(*args)
|
18
|
-
hash_args = args.
|
19
|
-
other_args = args.select{|s| !s.is_a?(Hash) }
|
18
|
+
hash_args, other_args = args.partition { |s| s.is_a?(Hash) }
|
20
19
|
preloaded_model = DeepPluck::PreloadedModel.new(self, other_args)
|
21
20
|
model = DeepPluck::Model.new(self.class.where(id: id), preloaded_model: preloaded_model)
|
22
|
-
|
21
|
+
model.add(*hash_args) if hash_args.any?
|
22
|
+
return model.load_all.first
|
23
23
|
end
|
24
24
|
end
|
data/lib/deep_pluck/model.rb
CHANGED
@@ -10,7 +10,7 @@ module DeepPluck
|
|
10
10
|
@preloaded_model = preloaded_model
|
11
11
|
@parent_association_key = parent_association_key
|
12
12
|
@parent_model = parent_model
|
13
|
-
@need_columns = []
|
13
|
+
@need_columns = (preloaded_model ? preloaded_model.need_columns : [])
|
14
14
|
@associations = {}
|
15
15
|
end
|
16
16
|
|
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: 1.1.
|
4
|
+
version: 1.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- khiav reoy
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-07-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -106,6 +106,7 @@ files:
|
|
106
106
|
- ".gitignore"
|
107
107
|
- ".rubocop.yml"
|
108
108
|
- ".travis.yml"
|
109
|
+
- CHANGELOG.md
|
109
110
|
- CODE_OF_CONDUCT.md
|
110
111
|
- LICENSE.txt
|
111
112
|
- README.md
|
@@ -117,6 +118,7 @@ files:
|
|
117
118
|
- gemfiles/4.2.gemfile
|
118
119
|
- gemfiles/5.0.gemfile
|
119
120
|
- gemfiles/5.1.gemfile
|
121
|
+
- gemfiles/5.2.gemfile
|
120
122
|
- lib/deep_pluck.rb
|
121
123
|
- lib/deep_pluck/data_combiner.rb
|
122
124
|
- lib/deep_pluck/model.rb
|
@@ -142,7 +144,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
142
144
|
version: '0'
|
143
145
|
requirements: []
|
144
146
|
rubyforge_project:
|
145
|
-
rubygems_version: 2.6
|
147
|
+
rubygems_version: 2.7.6
|
146
148
|
signing_key:
|
147
149
|
specification_version: 4
|
148
150
|
summary: Use deep_pluck as a shortcut to select one or more attributes and include
|