n1_loader 1.4.4 → 1.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.circleci/config.yml +22 -2
- data/CHANGELOG.md +4 -0
- data/README.md +3 -3
- data/activerecord-gemfiles/ar_7_latest.gemfile +3 -0
- data/lib/n1_loader/active_record/associations_preloader_v7.rb +40 -0
- data/lib/n1_loader/active_record/loader_collection.rb +8 -0
- data/lib/n1_loader/active_record.rb +6 -2
- data/lib/n1_loader/version.rb +1 -1
- data/n1_loader.gemspec +2 -2
- metadata +6 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bf26363e90cf5f0b6759776698445183f4abe8442bf366e7109e1cada18b1eaa
|
4
|
+
data.tar.gz: e082a72dc1f910262fbc73040b484ae28e437beee866ca42277a7556d989072a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 52993103afc0075d9d71088e6d7e60925ea1740176ee31829acb5d42009a38955b25d8e9124a17fff981b4735f443c04d3532cbea3186850bffc2908f0e40522
|
7
|
+
data.tar.gz: fdcc21a626ff199ccf4a9af7bd860516745693614404c44159414b27601750ea476de8eae593f7bade3782425b638f784db096e6dcdaafa58c71382f3a08b979
|
data/.circleci/config.yml
CHANGED
@@ -106,7 +106,8 @@ workflows:
|
|
106
106
|
]
|
107
107
|
activerecord-gemfile: [
|
108
108
|
"ar_5_latest",
|
109
|
-
"ar_6_latest"
|
109
|
+
"ar_6_latest",
|
110
|
+
"ar_7_latest"
|
110
111
|
]
|
111
112
|
ar_lazy_preload-gemfile: [
|
112
113
|
"ar_lazy_preload_0.6.1",
|
@@ -115,21 +116,40 @@ workflows:
|
|
115
116
|
exclude:
|
116
117
|
# Ruby 2.5 and AR Lazy Preload 1+
|
117
118
|
- ruby-version: "2.5"
|
118
|
-
activerecord-gemfile: "ar_5_latest"
|
119
119
|
ar_lazy_preload-gemfile: "ar_lazy_preload_master"
|
120
|
+
activerecord-gemfile: "ar_5_latest"
|
120
121
|
|
121
122
|
- ruby-version: "2.5"
|
123
|
+
ar_lazy_preload-gemfile: "ar_lazy_preload_master"
|
122
124
|
activerecord-gemfile: "ar_6_latest"
|
125
|
+
|
126
|
+
- ruby-version: "2.5"
|
123
127
|
ar_lazy_preload-gemfile: "ar_lazy_preload_master"
|
128
|
+
activerecord-gemfile: "ar_7_latest"
|
124
129
|
|
125
130
|
# AR 5 and ruby 3+
|
126
131
|
- ruby-version: "latest"
|
127
132
|
activerecord-gemfile: "ar_5_latest"
|
128
133
|
ar_lazy_preload-gemfile: "ar_lazy_preload_0.6.1"
|
134
|
+
|
129
135
|
- ruby-version: "latest"
|
130
136
|
activerecord-gemfile: "ar_5_latest"
|
131
137
|
ar_lazy_preload-gemfile: "ar_lazy_preload_master"
|
132
138
|
|
139
|
+
# AR 7 and ar_lazy_preload < 1
|
140
|
+
- ruby-version: "2.5"
|
141
|
+
activerecord-gemfile: "ar_7_latest"
|
142
|
+
ar_lazy_preload-gemfile: "ar_lazy_preload_0.6.1"
|
143
|
+
|
144
|
+
- ruby-version: "2.7"
|
145
|
+
activerecord-gemfile: "ar_7_latest"
|
146
|
+
ar_lazy_preload-gemfile: "ar_lazy_preload_0.6.1"
|
147
|
+
|
148
|
+
- ruby-version: "latest"
|
149
|
+
activerecord-gemfile: "ar_7_latest"
|
150
|
+
ar_lazy_preload-gemfile: "ar_lazy_preload_0.6.1"
|
151
|
+
|
152
|
+
|
133
153
|
name: ruby-<< matrix.ruby-version >>-<< matrix.activerecord-gemfile >>-<< matrix.ar_lazy_preload-gemfile >>
|
134
154
|
- rubocop:
|
135
155
|
requires:
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
[![CircleCI][1]][2]
|
4
4
|
[![Gem Version][3]][4]
|
5
5
|
|
6
|
-
N1Loader is designed to provide a way for avoiding [N+1 issues][7] of any kind.
|
6
|
+
N1Loader is designed to provide a simple way for avoiding [N+1 issues][7] of any kind.
|
7
7
|
For example, it can help with resolving N+1 for:
|
8
8
|
- database querying (most common case)
|
9
9
|
- 3rd party service calls
|
@@ -23,7 +23,7 @@ gem 'n1_loader', require: 'n1_loader/ar_lazy_preload'
|
|
23
23
|
|
24
24
|
## Enhance [ActiveRecord][5]
|
25
25
|
|
26
|
-
Are you working with well-known Rails application? Try it out how well N1Loader fulfills missing gaps!
|
26
|
+
Are you working with well-known Rails application? Try it out and see how well N1Loader fulfills missing gaps when you can't define ActiveRecord associations!
|
27
27
|
|
28
28
|
```ruby
|
29
29
|
gem 'n1_loader', require: 'n1_loader/active_record'
|
@@ -173,4 +173,4 @@ Copyright (c) Evgeniy Demin. See [LICENSE.txt](LICENSE.txt) for further details.
|
|
173
173
|
[5]: https://github.com/rails/rails/tree/main/activerecord
|
174
174
|
[6]: https://github.com/DmitryTsepelev/ar_lazy_preload
|
175
175
|
[7]: https://stackoverflow.com/questions/97197/what-is-the-n1-selects-problem-in-orm-object-relational-mapping
|
176
|
-
[8]: https://github.com/djezzzl/n1_loader
|
176
|
+
[8]: https://github.com/djezzzl/n1_loader
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module N1Loader
|
4
|
+
module ActiveRecord
|
5
|
+
module Associations
|
6
|
+
module Preloader # :nodoc:
|
7
|
+
N1LoaderReflection = Struct.new(:key, :loader) do
|
8
|
+
def options
|
9
|
+
{}
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def preloaders_for_reflection(reflection, records)
|
14
|
+
return super unless reflection.is_a?(N1LoaderReflection)
|
15
|
+
|
16
|
+
N1Loader::Preloader.new(records).preload(reflection.key)
|
17
|
+
end
|
18
|
+
|
19
|
+
def grouped_records # rubocop:disable Metrics/PerceivedComplexity, Metrics/MethodLength, Metrics/CyclomaticComplexity, Metrics/AbcSize
|
20
|
+
n1_load_records, records = source_records.partition do |record|
|
21
|
+
record.class.respond_to?(:n1_loader_defined?) && record.class.n1_loader_defined?(association)
|
22
|
+
end
|
23
|
+
|
24
|
+
h = n1_load_records.group_by do |record|
|
25
|
+
N1LoaderReflection.new(association, record.class.n1_loader(association))
|
26
|
+
end
|
27
|
+
|
28
|
+
polymorphic_parent = !root? && parent.polymorphic?
|
29
|
+
records.each do |record|
|
30
|
+
reflection = record.class._reflect_on_association(association)
|
31
|
+
next if polymorphic_parent && !reflection || !record.association(association).klass
|
32
|
+
|
33
|
+
(h[reflection] ||= []) << record
|
34
|
+
end
|
35
|
+
h
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -21,10 +21,14 @@ ActiveSupport.on_load(:active_record) do
|
|
21
21
|
case ActiveRecord::VERSION::MAJOR
|
22
22
|
when 6
|
23
23
|
require_relative "active_record/associations_preloader_v6"
|
24
|
-
|
24
|
+
ActiveRecord::Associations::Preloader.prepend(N1Loader::ActiveRecord::Associations::Preloader)
|
25
|
+
when 5
|
25
26
|
require_relative "active_record/associations_preloader_v5"
|
27
|
+
ActiveRecord::Associations::Preloader.prepend(N1Loader::ActiveRecord::Associations::Preloader)
|
28
|
+
else
|
29
|
+
require_relative "active_record/associations_preloader_v7"
|
30
|
+
ActiveRecord::Associations::Preloader::Branch.prepend(N1Loader::ActiveRecord::Associations::Preloader)
|
26
31
|
end
|
27
32
|
|
28
|
-
ActiveRecord::Associations::Preloader.prepend(N1Loader::ActiveRecord::Associations::Preloader)
|
29
33
|
ActiveRecord::Base.include(N1Loader::ActiveRecord::Base)
|
30
34
|
end
|
data/lib/n1_loader/version.rb
CHANGED
data/n1_loader.gemspec
CHANGED
@@ -22,9 +22,9 @@ Gem::Specification.new do |spec|
|
|
22
22
|
end
|
23
23
|
spec.require_paths = ["lib"]
|
24
24
|
|
25
|
-
spec.add_development_dependency "activerecord", ">= 5"
|
25
|
+
spec.add_development_dependency "activerecord", ">= 5"
|
26
26
|
spec.add_development_dependency "ar_lazy_preload", ">= 0.6"
|
27
|
-
spec.add_development_dependency "db-query-matchers", "~> 0.
|
27
|
+
spec.add_development_dependency "db-query-matchers", "~> 0.11"
|
28
28
|
spec.add_development_dependency "graphql", "~> 2.0"
|
29
29
|
spec.add_development_dependency "rails", ">= 5"
|
30
30
|
spec.add_development_dependency "rspec", "~> 3.0"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: n1_loader
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Evgeniy Demin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-05-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -17,9 +17,6 @@ dependencies:
|
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '5'
|
20
|
-
- - "<"
|
21
|
-
- !ruby/object:Gem::Version
|
22
|
-
version: '7'
|
23
20
|
type: :development
|
24
21
|
prerelease: false
|
25
22
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -27,9 +24,6 @@ dependencies:
|
|
27
24
|
- - ">="
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: '5'
|
30
|
-
- - "<"
|
31
|
-
- !ruby/object:Gem::Version
|
32
|
-
version: '7'
|
33
27
|
- !ruby/object:Gem::Dependency
|
34
28
|
name: ar_lazy_preload
|
35
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -50,14 +44,14 @@ dependencies:
|
|
50
44
|
requirements:
|
51
45
|
- - "~>"
|
52
46
|
- !ruby/object:Gem::Version
|
53
|
-
version: '0.
|
47
|
+
version: '0.11'
|
54
48
|
type: :development
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
51
|
requirements:
|
58
52
|
- - "~>"
|
59
53
|
- !ruby/object:Gem::Version
|
60
|
-
version: '0.
|
54
|
+
version: '0.11'
|
61
55
|
- !ruby/object:Gem::Dependency
|
62
56
|
name: graphql
|
63
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -161,6 +155,7 @@ files:
|
|
161
155
|
- Rakefile
|
162
156
|
- activerecord-gemfiles/ar_5_latest.gemfile
|
163
157
|
- activerecord-gemfiles/ar_6_latest.gemfile
|
158
|
+
- activerecord-gemfiles/ar_7_latest.gemfile
|
164
159
|
- ar_lazy_preload-gemfiles/ar_lazy_preload_0.6.1.gemfile
|
165
160
|
- ar_lazy_preload-gemfiles/ar_lazy_preload_master.gemfile
|
166
161
|
- bin/console
|
@@ -182,6 +177,7 @@ files:
|
|
182
177
|
- lib/n1_loader/active_record.rb
|
183
178
|
- lib/n1_loader/active_record/associations_preloader_v5.rb
|
184
179
|
- lib/n1_loader/active_record/associations_preloader_v6.rb
|
180
|
+
- lib/n1_loader/active_record/associations_preloader_v7.rb
|
185
181
|
- lib/n1_loader/active_record/base.rb
|
186
182
|
- lib/n1_loader/active_record/loader.rb
|
187
183
|
- lib/n1_loader/active_record/loader_collection.rb
|