associationist 0.1.8 → 0.1.9

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8685abcebf828aabc6f3337bfcbf4baac04c73dc847b5a235933c5b2e3e8e487
4
- data.tar.gz: 21983405667e166041b1ad1670cdf399813d83579c4408ba0aa0c9e3d5dd8359
3
+ metadata.gz: 187820657e6aa46774e5161d105e4ae1e939d062ec389be51a9e510b5eda7aed
4
+ data.tar.gz: 57b2cdc4270aaf9b75a3b52957ce272e8c4492087079c20b5771208b8a2a9fe0
5
5
  SHA512:
6
- metadata.gz: 8d77f497b70cf83ff9912af6cd80c3608de1593461fe0c1f30dbcfe459fe17fd118b94383ca78a37d38fbab5d5e1d2eb697fbbb8f0938e88b6ac7b78f62b180e
7
- data.tar.gz: 71f89b2f935278cf9d044152d6fa92895af98e05a9f49523d0031ab39d0dca1d81f7546bfdbbf338c124c187d94100c10f6981e18451acb317e09c2063465f4e
6
+ metadata.gz: 938dd23506837a38292a3ae074a72a2b40815ddae10f0f946e14e00514b8cd601baa006b4589f580406aad73ff7ed8065e0d710544ba90c3847c63e4916cf30e
7
+ data.tar.gz: 830e60e54c9c865ff97c5b6d57b92270b67625093a3c28828e6d89f9abb44cbd2565080c9b8fcc3bdd967cd4e9cbce1b0307728e6ee9000844777c7af808c297
@@ -2,13 +2,18 @@ module Associationist
2
2
  module Associations
3
3
  module Preloader
4
4
  class SingularAssociation
5
- def initialize klass, owners, reflection, preload_scope, associate_by_default = true
5
+ attr_reader :klass
6
+ def initialize klass, owners, reflection, preload_scope, reflection_scope = nil, associate_by_default = true
7
+ @klass = klass
6
8
  @owners = owners
7
9
  @reflection = reflection
10
+ @run = false
8
11
  end
9
12
 
10
13
  # handle >= 6.0
11
14
  def run preloader = nil
15
+ return self if @run
16
+ @run = true
12
17
  case
13
18
  when @reflection.config.preloader_proc
14
19
  @reflection.config.preloader_proc.call(@owners).each do |record, value|
@@ -36,15 +41,43 @@ module Associationist
36
41
  def preloaded_records
37
42
  @owners.flat_map { |owner| owner.association(@reflection.name).target }
38
43
  end
44
+
45
+ # handle >=7.0
46
+ def runnable_loaders
47
+ [self]
48
+ end
49
+
50
+ def run?
51
+ @run
52
+ end
53
+
54
+ def future_classes
55
+ if run?
56
+ []
57
+ else
58
+ if @klass <= ActiveRecord::Base
59
+ [@klass]
60
+ else
61
+ []
62
+ end
63
+ end
64
+ end
65
+
66
+ def table_name
67
+ if @klass <= ActiveRecord::Base
68
+ @klass.table_name
69
+ else
70
+ nil
71
+ end
72
+ end
39
73
  end
40
74
 
41
75
  end
42
76
  end
43
77
 
44
- module ActiveRecordPreloaderPatch
45
- case
46
- when ActiveRecord.version < Gem::Version.new('5.2.0')
47
- def preloader_for(reflection, owners, rhs_klass)
78
+ if ActiveRecord.version >= Gem::Version.new('7.0.0')
79
+ module ActiveRecordPreloaderBranchPatch
80
+ def preloader_for(reflection)
48
81
  config = reflection.options[:associationist]
49
82
  if config
50
83
  Associationist::Associations::Preloader::SingularAssociation
@@ -52,17 +85,72 @@ module Associationist
52
85
  super
53
86
  end
54
87
  end
55
- when ActiveRecord.version >= Gem::Version.new('5.2.0')
56
- def preloader_for(reflection, owners)
57
- config = reflection.options[:associationist]
58
- if config
59
- Associationist::Associations::Preloader::SingularAssociation
60
- else
61
- super
88
+ end
89
+
90
+ ActiveRecord::Associations::Preloader::Branch.prepend ActiveRecordPreloaderBranchPatch
91
+
92
+ module ActiveRecordPreloaderPatch
93
+ end
94
+
95
+ ActiveRecord::Associations::Preloader.prepend ActiveRecordPreloaderPatch
96
+
97
+ module ActiveRecordPreloaderBatchPatch
98
+ def call
99
+ branches = @preloaders.flat_map(&:branches)
100
+ until branches.empty?
101
+ loaders = branches.flat_map(&:runnable_loaders)
102
+ loaders.each do |loader|
103
+ if loader.is_a? Associationist::Associations::Preloader::SingularAssociation
104
+ else
105
+ loader.associate_records_from_unscoped(@available_records[loader.klass.base_class])
106
+ end
107
+ end
108
+
109
+ if loaders.any?
110
+ future_tables = branches.flat_map do |branch|
111
+ branch.future_classes - branch.runnable_loaders.map(&:klass)
112
+ end.map(&:table_name).uniq
113
+
114
+ target_loaders = loaders.reject { |l| future_tables.include?(l.table_name) }
115
+ target_loaders = loaders if target_loaders.empty?
116
+
117
+ non_associationist_loaders = target_loaders.reject{|x| x.is_a? Associationist::Associations::Preloader::SingularAssociation}
118
+ group_and_load_similar(non_associationist_loaders)
119
+ target_loaders.each(&:run)
120
+ end
121
+
122
+ finished, in_progress = branches.partition(&:done?)
123
+
124
+ branches = in_progress + finished.flat_map(&:children)
62
125
  end
63
126
  end
64
127
  end
65
- end
66
128
 
67
- ActiveRecord::Associations::Preloader.prepend ActiveRecordPreloaderPatch
129
+ ActiveRecord::Associations::Preloader::Batch.prepend ActiveRecordPreloaderBatchPatch
130
+ else
131
+ module ActiveRecordPreloaderPatch
132
+ case
133
+ when ActiveRecord.version < Gem::Version.new('5.2.0')
134
+ def preloader_for(reflection, owners, rhs_klass)
135
+ config = reflection.options[:associationist]
136
+ if config
137
+ Associationist::Associations::Preloader::SingularAssociation
138
+ else
139
+ super
140
+ end
141
+ end
142
+ when ActiveRecord.version >= Gem::Version.new('5.2.0')
143
+ def preloader_for(reflection, owners)
144
+ config = reflection.options[:associationist]
145
+ if config
146
+ Associationist::Associations::Preloader::SingularAssociation
147
+ else
148
+ super
149
+ end
150
+ end
151
+ end
152
+ end
153
+
154
+ ActiveRecord::Associations::Preloader.prepend ActiveRecordPreloaderPatch
155
+ end
68
156
  end
@@ -25,7 +25,11 @@ module Associationist
25
25
  if reflection.config.scope_proc
26
26
  association_scope.klass
27
27
  else
28
- Object
28
+ if reflection.config.class_name
29
+ reflection.config.class_name.constantize
30
+ else
31
+ Object
32
+ end
29
33
  end
30
34
  end
31
35
 
@@ -30,6 +30,10 @@ module Associationist
30
30
  @config[:scope]
31
31
  end
32
32
 
33
+ def class_name
34
+ @config[:class_name]
35
+ end
36
+
33
37
  def check
34
38
  if @config[:loader] && @config[:scope]
35
39
  raise "cannot define both loader and scope"
@@ -1,3 +1,3 @@
1
1
  module Associationist
2
- VERSION = '0.1.8'
2
+ VERSION = '0.1.9'
3
3
  end
@@ -5,7 +5,13 @@ Dir.glob("#{File.dirname(__FILE__)}/**/*.rb").each do |file|
5
5
  end
6
6
 
7
7
  module Associationist
8
- def self.preload records, associations
9
- ActiveRecord::Associations::Preloader.new.preload records, associations
8
+ if ActiveRecord.version >= Gem::Version.new('7.0.0')
9
+ def self.preload records, associations
10
+ ActiveRecord::Associations::Preloader.new(records: records, associations: associations).call
11
+ end
12
+ else
13
+ def self.preload records, associations
14
+ ActiveRecord::Associations::Preloader.new.preload records, associations
15
+ end
10
16
  end
11
17
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: associationist
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.8
4
+ version: 0.1.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - onyxblade
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-07-28 00:00:00.000000000 Z
11
+ date: 2021-12-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -19,7 +19,7 @@ dependencies:
19
19
  version: '5.0'
20
20
  - - "<"
21
21
  - !ruby/object:Gem::Version
22
- version: '6.2'
22
+ version: '7.1'
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -29,7 +29,7 @@ dependencies:
29
29
  version: '5.0'
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
- version: '6.2'
32
+ version: '7.1'
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: pry
35
35
  requirement: !ruby/object:Gem::Requirement