goldiloader 4.0.0 → 4.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/goldiloader/active_record_patches.rb +23 -18
- data/lib/goldiloader/association_loader.rb +1 -1
- data/lib/goldiloader/auto_include_context.rb +7 -1
- data/lib/goldiloader/compatibility.rb +14 -3
- data/lib/goldiloader/version.rb +1 -1
- data/lib/goldiloader.rb +34 -0
- metadata +22 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 14cd0ebc332f63f4f019029af0c75254207ad6b3957d3204b458200ffe89aa61
|
4
|
+
data.tar.gz: 151fe68d70ebc800bd471204106d49e7208678b6f0d5e1495a08302859f8574d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4b387491503a50e6108c0fb3df8419eaea1032a302908afbaa0302582e37819250eecf569fb53c7eb29f4d204fe2d799b4fd0e5f71f9afc026b104370e5132b6
|
7
|
+
data.tar.gz: 62554443b9814f9487f63a39e2cd6c0da8bd85fc0985fc87f078e21b812f91d453676c72db9794d8d40fb5d04edd3e7220cad9aaf2c7bb94c374604b6b8de815
|
@@ -68,23 +68,26 @@ module Goldiloader
|
|
68
68
|
ActiveRecord::Relation::Merger.prepend(::Goldiloader::MergerPatch)
|
69
69
|
|
70
70
|
module AssociationReflectionPatch
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
@
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
71
|
+
# Note we need to pass the association's target class as an argument since it won't be known
|
72
|
+
# outside the context of an association instance for polymorphic associations.
|
73
|
+
def eager_loadable?(target_klass)
|
74
|
+
@eager_loadable_cache ||= Hash.new do |cache, target_klass_key|
|
75
|
+
cache[target_klass_key] = if scope.nil?
|
76
|
+
# Associations without any scoping options are eager loadable
|
77
|
+
true
|
78
|
+
elsif scope.arity > 0
|
79
|
+
# The scope will be evaluated for every model instance so it can't
|
80
|
+
# be eager loaded
|
81
|
+
false
|
82
|
+
else
|
83
|
+
scope_info = Goldiloader::ScopeInfo.new(scope_for(target_klass_key.unscoped))
|
84
|
+
scope_info.auto_include? &&
|
85
|
+
!scope_info.limit? &&
|
86
|
+
!scope_info.offset? &&
|
87
|
+
(!has_one? || !scope_info.order?)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
@eager_loadable_cache[target_klass]
|
88
91
|
end
|
89
92
|
end
|
90
93
|
ActiveRecord::Reflection::AssociationReflection.include(::Goldiloader::AssociationReflectionPatch)
|
@@ -111,11 +114,13 @@ module Goldiloader
|
|
111
114
|
private
|
112
115
|
|
113
116
|
def eager_loadable?
|
114
|
-
reflection.eager_loadable? &&
|
117
|
+
klass && reflection.eager_loadable?(klass) &&
|
115
118
|
(::Goldiloader::Compatibility.destroyed_model_associations_eager_loadable? || !owner.destroyed?)
|
116
119
|
end
|
117
120
|
|
118
121
|
def load_with_auto_include
|
122
|
+
return yield unless Goldiloader.enabled?
|
123
|
+
|
119
124
|
if loaded? && !stale_target?
|
120
125
|
target
|
121
126
|
elsif !auto_include?
|
@@ -15,7 +15,7 @@ module Goldiloader
|
|
15
15
|
private
|
16
16
|
|
17
17
|
def eager_load(models, association_name)
|
18
|
-
if Goldiloader::Compatibility.
|
18
|
+
if Goldiloader::Compatibility.pre_rails_7?
|
19
19
|
::ActiveRecord::Associations::Preloader.new.preload(models, [association_name])
|
20
20
|
else
|
21
21
|
::ActiveRecord::Associations::Preloader.new(records: models, associations: [association_name]).call
|
@@ -37,7 +37,13 @@ module Goldiloader
|
|
37
37
|
end
|
38
38
|
|
39
39
|
def register_models(models)
|
40
|
-
Array.wrap(
|
40
|
+
# Don't use Array() or Array.wrap() because they will check respond_to?(:to_ary)
|
41
|
+
# which for ActiveStorage::Attachment will delegate to the blob association which
|
42
|
+
# triggers an infinite eager loading loop on the association
|
43
|
+
models = [models] unless models.is_a?(Array)
|
44
|
+
models.each do |model|
|
45
|
+
next if model.nil?
|
46
|
+
|
41
47
|
model.auto_include_context = self
|
42
48
|
self.models << model
|
43
49
|
end
|
@@ -3,11 +3,22 @@
|
|
3
3
|
module Goldiloader
|
4
4
|
module Compatibility
|
5
5
|
ACTIVE_RECORD_VERSION = ::Gem::Version.new(::ActiveRecord::VERSION::STRING).release
|
6
|
-
PRE_RAILS_6_2 = ACTIVE_RECORD_VERSION < ::Gem::Version.new('6.2.0')
|
7
6
|
RAILS_5_2_0 = ACTIVE_RECORD_VERSION == ::Gem::Version.new('5.2.0')
|
8
7
|
|
9
|
-
def self.
|
10
|
-
|
8
|
+
def self.pre_rails_7?
|
9
|
+
::ActiveRecord::VERSION::MAJOR < 7
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.rails_5_2?
|
13
|
+
::ActiveRecord::VERSION::MAJOR == 5 && ::ActiveRecord::VERSION::MINOR == 2
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.rails_6_1?
|
17
|
+
::ActiveRecord::VERSION::MAJOR == 6 && ::ActiveRecord::VERSION::MINOR == 1
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.rails_6_1_or_greater?
|
21
|
+
::ActiveRecord::VERSION::MAJOR > 6 || rails_6_1?
|
11
22
|
end
|
12
23
|
|
13
24
|
# See https://github.com/rails/rails/pull/32375
|
data/lib/goldiloader/version.rb
CHANGED
data/lib/goldiloader.rb
CHANGED
@@ -8,3 +8,37 @@ require 'goldiloader/scope_info'
|
|
8
8
|
require 'goldiloader/association_options'
|
9
9
|
require 'goldiloader/association_loader'
|
10
10
|
require 'goldiloader/active_record_patches'
|
11
|
+
|
12
|
+
module Goldiloader
|
13
|
+
class << self
|
14
|
+
|
15
|
+
# Sets the process-wide enabled status
|
16
|
+
attr_accessor :globally_enabled
|
17
|
+
|
18
|
+
def enabled?
|
19
|
+
Thread.current.fetch(:goldiloader_enabled, globally_enabled)
|
20
|
+
end
|
21
|
+
|
22
|
+
def enabled=(val)
|
23
|
+
Thread.current[:goldiloader_enabled] = val
|
24
|
+
end
|
25
|
+
|
26
|
+
def enabled
|
27
|
+
old_enabled = Thread.current[:goldiloader_enabled]
|
28
|
+
self.enabled = true
|
29
|
+
yield
|
30
|
+
ensure
|
31
|
+
self.enabled = old_enabled
|
32
|
+
end
|
33
|
+
|
34
|
+
def disabled
|
35
|
+
old_enabled = Thread.current[:goldiloader_enabled]
|
36
|
+
self.enabled = false
|
37
|
+
yield
|
38
|
+
ensure
|
39
|
+
self.enabled = old_enabled
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
self.globally_enabled = true
|
44
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: goldiloader
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joel Turkel
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-10-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -50,6 +50,26 @@ dependencies:
|
|
50
50
|
- - "<"
|
51
51
|
- !ruby/object:Gem::Version
|
52
52
|
version: '7.1'
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: activestorage
|
55
|
+
requirement: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '5.2'
|
60
|
+
- - "<"
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '7.1'
|
63
|
+
type: :development
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '5.2'
|
70
|
+
- - "<"
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: '7.1'
|
53
73
|
- !ruby/object:Gem::Dependency
|
54
74
|
name: appraisal
|
55
75
|
requirement: !ruby/object:Gem::Requirement
|