goldiloader 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +16 -3
- data/goldiloader.gemspec +2 -2
- data/lib/goldiloader.rb +1 -1
- data/lib/goldiloader/active_record_patches.rb +15 -11
- data/lib/goldiloader/association_info.rb +35 -1
- data/lib/goldiloader/association_loader.rb +6 -7
- data/lib/goldiloader/auto_include_context.rb +6 -4
- data/lib/goldiloader/compatibility.rb +18 -0
- data/lib/goldiloader/version.rb +1 -1
- data/spec/db/schema.rb +25 -1
- data/spec/goldiloader/goldiloader_spec.rb +86 -8
- data/spec/spec_helper.rb +0 -3
- metadata +11 -13
- data/lib/goldiloader/model_registry.rb +0 -26
- data/spec/support/compatibility.rb +0 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3912274cc2f34e5dafb2a3b1d8ee8e3f6521885e
|
4
|
+
data.tar.gz: 72e93497e463d924c5c06c49df9d10cb7427170a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 80396bbcaddfe170d4fd0db9a199839ef07c65d4fbfe8947de40dd31ab0500c86db372c11b105f3efaa980506402582af656da202088d7cd559c1f2d0dc10521
|
7
|
+
data.tar.gz: 060d399492cbbcd68cdb053fbc08c91781826404678e694287768d770c42736b39e5ad8e06cbad4600c0b2262fee4af4df469232fd973b6ccadb562c969d34ec
|
data/CHANGELOG.md
CHANGED
@@ -1,11 +1,24 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
### 0.0.5
|
4
|
+
|
5
|
+
* Fix ActiveRecord and ActiveSupport dependencies to work with versions greater than 4.1.0. Thanks for the pull
|
6
|
+
requests [Alexey Volodkin](https://github.com/miraks) and [Philip Claren](https://github.com/DerKobe).
|
7
|
+
* Workaround [issue 13](https://github.com/salsify/goldiloader/issues/13) by not auto-eager loading associations
|
8
|
+
that use `unscope`. This workaround will be removed when the underlying
|
9
|
+
[bug 11036](https://github.com/rails/rails/issues/11036) in the Rails eager loader is fixed.
|
10
|
+
* Workaround [issue 11](https://github.com/salsify/goldiloader/issues/11) by not auto-eager loading associations
|
11
|
+
that use `joins`. This workaround will be removed when the underlying
|
12
|
+
[bug 11518](https://github.com/rails/rails/pull/11518) in the Rails eager loader is fixed.
|
13
|
+
* Fix [issue 15](https://github.com/salsify/goldiloader/issues/15) - Don't auto eager load associations
|
14
|
+
with finder_sql in Rails 4.0. Previously this was only done for Rails 3.2.
|
15
|
+
|
3
16
|
### 0.0.4
|
4
17
|
|
5
|
-
* Fix [issue 3](https://github.com/salsify/goldiloader/issues/3) - `exists?` method should take an argument
|
6
|
-
|
18
|
+
* Fix [issue 3](https://github.com/salsify/goldiloader/issues/3) - `exists?` method should take an argument.
|
19
|
+
Thanks for reporting [Bert Goethals](https://github.com/Bertg)
|
7
20
|
* Fix [issue 4](https://github.com/salsify/goldiloader/issues/4) - Associations couldn't be loaded in after
|
8
|
-
destroy callbacks
|
21
|
+
destroy callbacks. Thanks for reporting [Bert Goethals](https://github.com/Bertg)
|
9
22
|
* Fix [issue 6](https://github.com/salsify/goldiloader/issues/6) - Models in read only associations weren't
|
10
23
|
being marked as read only
|
11
24
|
* Fix [issue 7](https://github.com/salsify/goldiloader/issues/7) - Don't attempt to eager load associations that
|
data/goldiloader.gemspec
CHANGED
@@ -17,8 +17,8 @@ Gem::Specification.new do |spec|
|
|
17
17
|
spec.test_files = Dir.glob('spec/**/*')
|
18
18
|
spec.require_paths = ['lib']
|
19
19
|
|
20
|
-
spec.add_dependency 'activerecord', ENV.fetch('RAILS_VERSION', ['>= 3.2', '
|
21
|
-
spec.add_dependency 'activesupport', ENV.fetch('RAILS_VERSION', ['>= 3.2', '
|
20
|
+
spec.add_dependency 'activerecord', ENV.fetch('RAILS_VERSION', ['>= 3.2', '< 4.2'])
|
21
|
+
spec.add_dependency 'activesupport', ENV.fetch('RAILS_VERSION', ['>= 3.2', '< 4.2'])
|
22
22
|
|
23
23
|
spec.add_development_dependency 'coveralls'
|
24
24
|
spec.add_development_dependency 'database_cleaner', '>= 1.2'
|
data/lib/goldiloader.rb
CHANGED
@@ -2,9 +2,9 @@
|
|
2
2
|
|
3
3
|
require 'active_support/all'
|
4
4
|
require 'active_record'
|
5
|
+
require 'goldiloader/compatibility'
|
5
6
|
require 'goldiloader/auto_include_context'
|
6
7
|
require 'goldiloader/association_info'
|
7
8
|
require 'goldiloader/association_options'
|
8
9
|
require 'goldiloader/association_loader'
|
9
|
-
require 'goldiloader/model_registry'
|
10
10
|
require 'goldiloader/active_record_patches'
|
@@ -14,7 +14,12 @@ module Goldiloader
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def auto_include_context
|
17
|
-
@auto_include_context ||= Goldiloader::AutoIncludeContext.
|
17
|
+
@auto_include_context ||= Goldiloader::AutoIncludeContext.new.register_model(self)
|
18
|
+
end
|
19
|
+
|
20
|
+
def reload(*)
|
21
|
+
@auto_include_context = nil
|
22
|
+
super
|
18
23
|
end
|
19
24
|
end
|
20
25
|
end
|
@@ -28,7 +33,7 @@ ActiveRecord::Relation.class_eval do
|
|
28
33
|
|
29
34
|
models = exec_queries_without_auto_include
|
30
35
|
# Add all loaded models to the same AutoIncludeContext
|
31
|
-
auto_include_context = Goldiloader::AutoIncludeContext.
|
36
|
+
auto_include_context = Goldiloader::AutoIncludeContext.new
|
32
37
|
auto_include_context.register_models(models)
|
33
38
|
models
|
34
39
|
end
|
@@ -52,27 +57,26 @@ ActiveRecord::Associations::Association.class_eval do
|
|
52
57
|
!loaded? && options.fetch(:fully_load) { self.class.default_fully_load }
|
53
58
|
end
|
54
59
|
|
55
|
-
|
56
|
-
@auto_include_context ||= Goldiloader::AutoIncludeContext.new(owner.auto_include_context.model_registry,
|
57
|
-
owner.auto_include_context.association_path + [reflection.name])
|
58
|
-
end
|
60
|
+
private
|
59
61
|
|
60
62
|
def eager_loadable?
|
61
63
|
association_info = Goldiloader::AssociationInfo.new(self)
|
62
64
|
!association_info.limit? &&
|
63
65
|
!association_info.offset? &&
|
64
66
|
!association_info.group? &&
|
65
|
-
!association_info.from?
|
67
|
+
!association_info.from? &&
|
68
|
+
!association_info.finder_sql? &&
|
69
|
+
# Joins not properly eager loaded - See https://github.com/salsify/goldiloader/issues/11
|
70
|
+
!association_info.joins? &&
|
71
|
+
# Unscope not properly eager loaded - https://github.com/salsify/goldiloader/issues/13
|
72
|
+
!association_info.unscope?
|
66
73
|
end
|
67
74
|
|
68
|
-
private
|
69
|
-
|
70
75
|
def load_with_auto_include(load_method, *args)
|
71
76
|
if loaded? && !stale_target?
|
72
77
|
target
|
73
78
|
elsif auto_include?
|
74
|
-
Goldiloader::AssociationLoader.load(
|
75
|
-
auto_include_context.association_path)
|
79
|
+
Goldiloader::AssociationLoader.load(owner, reflection.name)
|
76
80
|
target
|
77
81
|
else
|
78
82
|
send("#{load_method}_without_auto_include", *args)
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
1
3
|
module Goldiloader
|
2
4
|
class AssociationInfo
|
3
5
|
|
@@ -5,6 +7,16 @@ module Goldiloader
|
|
5
7
|
@association = association
|
6
8
|
end
|
7
9
|
|
10
|
+
def unscope?
|
11
|
+
Goldiloader::Compatibility.unscope_query_method_enabled? &&
|
12
|
+
@association.association_scope.unscope_values.present?
|
13
|
+
end
|
14
|
+
|
15
|
+
def finder_sql?
|
16
|
+
Goldiloader::Compatibility.association_finder_sql_enabled? &&
|
17
|
+
@association.options[:finder_sql].present?
|
18
|
+
end
|
19
|
+
|
8
20
|
if ActiveRecord::VERSION::MAJOR >= 4
|
9
21
|
def read_only?
|
10
22
|
@association.association_scope.readonly_value.present?
|
@@ -25,6 +37,23 @@ module Goldiloader
|
|
25
37
|
def group?
|
26
38
|
@association.association_scope.group_values.present?
|
27
39
|
end
|
40
|
+
|
41
|
+
def joins?
|
42
|
+
# Yuck - Through associations will always have a join for *each* 'through' table
|
43
|
+
(@association.association_scope.joins_values.size - num_through_joins) > 0
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def num_through_joins
|
49
|
+
association = @association
|
50
|
+
count = 0
|
51
|
+
while association.is_a?(ActiveRecord::Associations::ThroughAssociation)
|
52
|
+
count += 1
|
53
|
+
association = association.owner.association(association.through_reflection.name)
|
54
|
+
end
|
55
|
+
count
|
56
|
+
end
|
28
57
|
else
|
29
58
|
def read_only?
|
30
59
|
@association.options[:readonly].present?
|
@@ -39,12 +68,17 @@ module Goldiloader
|
|
39
68
|
end
|
40
69
|
|
41
70
|
def from?
|
42
|
-
|
71
|
+
false
|
43
72
|
end
|
44
73
|
|
45
74
|
def group?
|
46
75
|
@association.options[:group].present?
|
47
76
|
end
|
77
|
+
|
78
|
+
def joins?
|
79
|
+
# Rails 3 didn't support joins for associations
|
80
|
+
false
|
81
|
+
end
|
48
82
|
end
|
49
83
|
|
50
84
|
end
|
@@ -4,19 +4,18 @@ module Goldiloader
|
|
4
4
|
module AssociationLoader
|
5
5
|
extend self
|
6
6
|
|
7
|
-
def load(
|
8
|
-
|
9
|
-
models = model_registry.peers(model, model_path).select do |peer|
|
7
|
+
def load(model, association_name)
|
8
|
+
models = model.auto_include_context.models.select do |peer|
|
10
9
|
load?(peer, association_name)
|
11
10
|
end
|
12
11
|
|
13
12
|
eager_load(models, association_name)
|
14
13
|
|
15
|
-
associated_models = associated_models(models, association_name)
|
16
14
|
# Workaround Rails #15853 by setting models read only
|
17
|
-
|
18
|
-
|
19
|
-
|
15
|
+
if read_only?(models, association_name)
|
16
|
+
associated_models = associated_models(models, association_name)
|
17
|
+
mark_read_only(associated_models)
|
18
|
+
end
|
20
19
|
end
|
21
20
|
|
22
21
|
private
|
@@ -1,15 +1,17 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
|
3
3
|
module Goldiloader
|
4
|
-
class AutoIncludeContext
|
5
|
-
|
6
|
-
|
4
|
+
class AutoIncludeContext
|
5
|
+
attr_reader :models
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
@models = []
|
7
9
|
end
|
8
10
|
|
9
11
|
def register_models(models)
|
10
12
|
Array.wrap(models).each do |model|
|
11
13
|
model.auto_include_context = self
|
12
|
-
|
14
|
+
self.models << model
|
13
15
|
end
|
14
16
|
self
|
15
17
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
module Goldiloader
|
4
|
+
module Compatibility
|
5
|
+
|
6
|
+
def self.mass_assignment_security_enabled?
|
7
|
+
::ActiveRecord::VERSION::MAJOR < 4 || defined?(::ActiveRecord::MassAssignmentSecurity)
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.association_finder_sql_enabled?
|
11
|
+
::Gem::Version.new(::ActiveRecord::VERSION::STRING) < ::Gem::Version.new('4.1')
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.unscope_query_method_enabled?
|
15
|
+
::Gem::Version.new(::ActiveRecord::VERSION::STRING) >= ::Gem::Version.new('4.1')
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/goldiloader/version.rb
CHANGED
data/spec/db/schema.rb
CHANGED
@@ -67,17 +67,27 @@ class Blog < ActiveRecord::Base
|
|
67
67
|
has_many :grouped_posts, -> { group(:blog_id) }, class_name: 'Post'
|
68
68
|
has_many :offset_posts, -> { offset(2) }, class_name: 'Post'
|
69
69
|
has_many :from_posts, -> { from('(select distinct blog_id from posts) as posts') }, class_name: 'Post'
|
70
|
+
|
71
|
+
has_many :posts_ordered_by_author, -> { joins(:author).order('users.name') }, class_name: 'Post'
|
72
|
+
|
73
|
+
has_many :authors_with_join, -> { joins(:address).order('addresses.city') }, through: :posts, source: :author
|
70
74
|
else
|
71
75
|
has_many :read_only_posts, readonly: true, class_name: 'Post'
|
72
76
|
has_many :limited_posts, limit: 2, class_name: 'Post'
|
73
77
|
has_many :grouped_posts, group: :blog_id, class_name: 'Post'
|
74
78
|
has_many :offset_posts, offset: 2, class_name: 'Post'
|
75
|
-
|
79
|
+
|
80
|
+
has_many :posts_ordered_by_author, include: :author, order: 'users.name', class_name: 'Post'
|
81
|
+
end
|
82
|
+
|
83
|
+
if Goldiloader::Compatibility.association_finder_sql_enabled?
|
84
|
+
has_many :finder_sql_posts, finder_sql: Proc.new { "select distinct blog_id from posts where blog_id = #{self.id}" },
|
76
85
|
class_name: 'Post'
|
77
86
|
end
|
78
87
|
|
79
88
|
has_many :posts_overridden, class_name: 'Post'
|
80
89
|
has_many :authors, through: :posts
|
90
|
+
has_many :addresses, through: :authors
|
81
91
|
|
82
92
|
if Goldiloader::Compatibility.mass_assignment_security_enabled?
|
83
93
|
attr_accessible :name
|
@@ -118,6 +128,10 @@ class User < ActiveRecord::Base
|
|
118
128
|
has_one :address
|
119
129
|
has_one :address_without_auto_include, auto_include: false, class_name: 'Address'
|
120
130
|
|
131
|
+
if Goldiloader::Compatibility.unscope_query_method_enabled?
|
132
|
+
has_one :scoped_address_with_default_scope_remove, -> { unscope(where: :city) }, class_name: 'ScopedAddress'
|
133
|
+
end
|
134
|
+
|
121
135
|
if Goldiloader::Compatibility.mass_assignment_security_enabled?
|
122
136
|
attr_accessible :name
|
123
137
|
end
|
@@ -131,6 +145,16 @@ class Address < ActiveRecord::Base
|
|
131
145
|
end
|
132
146
|
end
|
133
147
|
|
148
|
+
class ScopedAddress < ActiveRecord::Base
|
149
|
+
self.table_name = 'addresses'
|
150
|
+
default_scope { where(city: ['Philadelphia'])}
|
151
|
+
belongs_to :user
|
152
|
+
|
153
|
+
if Goldiloader::Compatibility.mass_assignment_security_enabled?
|
154
|
+
attr_accessible :city
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
134
158
|
class Group < ActiveRecord::Base
|
135
159
|
has_many :tags, as: :owner
|
136
160
|
|
@@ -150,6 +150,19 @@ describe Goldiloader do
|
|
150
150
|
expect(User).to have_received(:find_by_sql).once
|
151
151
|
end
|
152
152
|
|
153
|
+
it "auto eager loads nested has_many through associations" do
|
154
|
+
blogs = Blog.order(:name).to_a
|
155
|
+
blogs.first.addresses.to_a
|
156
|
+
|
157
|
+
blogs.each do |blog|
|
158
|
+
expect(blog.association(:addresses)).to be_loaded
|
159
|
+
end
|
160
|
+
|
161
|
+
expect(blogs.first.addresses).to match_array([author1, author2].map(&:address))
|
162
|
+
expect(blogs.second.addresses).to match_array([author3, author1].map(&:address))
|
163
|
+
expect(Address).to have_received(:find_by_sql).once
|
164
|
+
end
|
165
|
+
|
153
166
|
it "auto eager loads associations when the model is loaded via find" do
|
154
167
|
blog = Blog.find(blog1.id)
|
155
168
|
blog.posts.to_a.first.author
|
@@ -235,8 +248,8 @@ describe Goldiloader do
|
|
235
248
|
let(:blogs) { Blog.order(:name).to_a }
|
236
249
|
|
237
250
|
before do
|
238
|
-
blog1.posts.create!(title: 'blog1-post3')
|
239
|
-
blog2.posts.create!(title: 'blog2-post3')
|
251
|
+
blog1.posts.create!(title: 'blog1-post3', author: author1)
|
252
|
+
blog2.posts.create!(title: 'blog2-post3', author: author1)
|
240
253
|
end
|
241
254
|
|
242
255
|
shared_examples "it doesn't auto eager the association" do |association_name|
|
@@ -283,16 +296,81 @@ describe Goldiloader do
|
|
283
296
|
it_behaves_like "it doesn't auto eager the association", :offset_posts
|
284
297
|
end
|
285
298
|
|
286
|
-
|
287
|
-
|
288
|
-
|
299
|
+
if ActiveRecord::VERSION::MAJOR >= 4
|
300
|
+
context "associations with an overridden from" do
|
301
|
+
before do
|
302
|
+
blogs.first.from_posts.to_a
|
303
|
+
end
|
304
|
+
|
305
|
+
it "applies the from correctly" do
|
306
|
+
expect(blogs.first.from_posts.to_a.size).to eq 1
|
307
|
+
end
|
308
|
+
|
309
|
+
it_behaves_like "it doesn't auto eager the association", :from_posts
|
289
310
|
end
|
311
|
+
end
|
312
|
+
|
313
|
+
if Goldiloader::Compatibility.association_finder_sql_enabled?
|
314
|
+
context "associations with finder_sql" do
|
315
|
+
before do
|
316
|
+
blogs.first.finder_sql_posts.to_a
|
317
|
+
end
|
318
|
+
|
319
|
+
it "applies the finder_sql correctly" do
|
320
|
+
expect(blogs.first.finder_sql_posts.to_a.size).to eq 1
|
321
|
+
end
|
290
322
|
|
291
|
-
|
292
|
-
expect(blogs.first.from_posts.to_a.size).to eq 1
|
323
|
+
it_behaves_like "it doesn't auto eager the association", :finder_sql_posts
|
293
324
|
end
|
325
|
+
end
|
294
326
|
|
295
|
-
|
327
|
+
if ActiveRecord::VERSION::MAJOR >= 4
|
328
|
+
context "associations with a join" do
|
329
|
+
before do
|
330
|
+
blogs.first.posts_ordered_by_author.to_a
|
331
|
+
end
|
332
|
+
|
333
|
+
it "applies the join correctly" do
|
334
|
+
expect(blogs.first.posts_ordered_by_author.to_a.size).to eq 3
|
335
|
+
end
|
336
|
+
|
337
|
+
it_behaves_like "it doesn't auto eager the association", :posts_ordered_by_author
|
338
|
+
end
|
339
|
+
|
340
|
+
context "associations with a join in a has_many_through" do
|
341
|
+
before do
|
342
|
+
blogs.first.authors_with_join.to_a
|
343
|
+
end
|
344
|
+
|
345
|
+
it "applies the join correctly" do
|
346
|
+
expect(blogs.first.authors_with_join.to_a.size).to eq 3
|
347
|
+
end
|
348
|
+
|
349
|
+
it_behaves_like "it doesn't auto eager the association", :authors_with_join
|
350
|
+
end
|
351
|
+
end
|
352
|
+
|
353
|
+
if Goldiloader::Compatibility.unscope_query_method_enabled?
|
354
|
+
context "associations with an unscoped" do
|
355
|
+
let(:authors) { User.order(:id).to_a }
|
356
|
+
|
357
|
+
before do
|
358
|
+
author1.address.update_attributes!(city: 'Boston')
|
359
|
+
author2.address.update_attributes!(city: 'Philadelphia')
|
360
|
+
author3.address.update_attributes!(city: 'Philadelphia')
|
361
|
+
authors.first.scoped_address_with_default_scope_remove
|
362
|
+
end
|
363
|
+
|
364
|
+
it "applies the unscope correctly" do
|
365
|
+
expect(authors.first.scoped_address_with_default_scope_remove).to be_present
|
366
|
+
end
|
367
|
+
|
368
|
+
it "doesn't auto eager the association" do
|
369
|
+
authors.drop(1).each do |author|
|
370
|
+
expect(author.association(:scoped_address_with_default_scope_remove)).to_not be_loaded
|
371
|
+
end
|
372
|
+
end
|
373
|
+
end
|
296
374
|
end
|
297
375
|
end
|
298
376
|
|
data/spec/spec_helper.rb
CHANGED
@@ -16,9 +16,6 @@ require 'database_cleaner'
|
|
16
16
|
require 'goldiloader'
|
17
17
|
require 'yaml'
|
18
18
|
|
19
|
-
spec_dir = File.dirname(__FILE__)
|
20
|
-
Dir["#{spec_dir}/support/**/*.rb"].sort.each { |f| require f }
|
21
|
-
|
22
19
|
FileUtils.makedirs('log')
|
23
20
|
|
24
21
|
ActiveRecord::Base.logger = Logger.new('log/test.log')
|
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: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joel Turkel
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-06-
|
11
|
+
date: 2014-06-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -17,9 +17,9 @@ dependencies:
|
|
17
17
|
- - '>='
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '3.2'
|
20
|
-
- -
|
20
|
+
- - <
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: '4.
|
22
|
+
version: '4.2'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -27,9 +27,9 @@ dependencies:
|
|
27
27
|
- - '>='
|
28
28
|
- !ruby/object:Gem::Version
|
29
29
|
version: '3.2'
|
30
|
-
- -
|
30
|
+
- - <
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: '4.
|
32
|
+
version: '4.2'
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: activesupport
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -37,9 +37,9 @@ dependencies:
|
|
37
37
|
- - '>='
|
38
38
|
- !ruby/object:Gem::Version
|
39
39
|
version: '3.2'
|
40
|
-
- -
|
40
|
+
- - <
|
41
41
|
- !ruby/object:Gem::Version
|
42
|
-
version: '4.
|
42
|
+
version: '4.2'
|
43
43
|
type: :runtime
|
44
44
|
prerelease: false
|
45
45
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -47,9 +47,9 @@ dependencies:
|
|
47
47
|
- - '>='
|
48
48
|
- !ruby/object:Gem::Version
|
49
49
|
version: '3.2'
|
50
|
-
- -
|
50
|
+
- - <
|
51
51
|
- !ruby/object:Gem::Version
|
52
|
-
version: '4.
|
52
|
+
version: '4.2'
|
53
53
|
- !ruby/object:Gem::Dependency
|
54
54
|
name: coveralls
|
55
55
|
requirement: !ruby/object:Gem::Requirement
|
@@ -156,13 +156,12 @@ files:
|
|
156
156
|
- lib/goldiloader/association_loader.rb
|
157
157
|
- lib/goldiloader/association_options.rb
|
158
158
|
- lib/goldiloader/auto_include_context.rb
|
159
|
-
- lib/goldiloader/
|
159
|
+
- lib/goldiloader/compatibility.rb
|
160
160
|
- lib/goldiloader/version.rb
|
161
161
|
- spec/db/database.yml
|
162
162
|
- spec/db/schema.rb
|
163
163
|
- spec/goldiloader/goldiloader_spec.rb
|
164
164
|
- spec/spec_helper.rb
|
165
|
-
- spec/support/compatibility.rb
|
166
165
|
homepage: https://github.com/salsify/goldiloader
|
167
166
|
licenses:
|
168
167
|
- MIT
|
@@ -192,4 +191,3 @@ test_files:
|
|
192
191
|
- spec/db/schema.rb
|
193
192
|
- spec/goldiloader/goldiloader_spec.rb
|
194
193
|
- spec/spec_helper.rb
|
195
|
-
- spec/support/compatibility.rb
|
@@ -1,26 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
module Goldiloader
|
4
|
-
class ModelRegistry
|
5
|
-
def initialize
|
6
|
-
@registry = {}
|
7
|
-
end
|
8
|
-
|
9
|
-
def register(record, association_path)
|
10
|
-
key = registry_key(record, association_path)
|
11
|
-
@registry[key] ||= []
|
12
|
-
@registry[key] << record
|
13
|
-
end
|
14
|
-
|
15
|
-
# Returns all models with the same base class loaded from the same association path
|
16
|
-
def peers(record, association_path)
|
17
|
-
@registry.fetch(registry_key(record, association_path), [])
|
18
|
-
end
|
19
|
-
|
20
|
-
private
|
21
|
-
|
22
|
-
def registry_key(record, association_path)
|
23
|
-
[record.class.base_class, association_path]
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
@@ -1,14 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
require 'active_support/version'
|
4
|
-
require 'active_record/version'
|
5
|
-
|
6
|
-
module Goldiloader
|
7
|
-
module Compatibility
|
8
|
-
|
9
|
-
def self.mass_assignment_security_enabled?
|
10
|
-
::ActiveRecord::VERSION::MAJOR < 4 || defined?(::ActiveRecord::MassAssignmentSecurity)
|
11
|
-
end
|
12
|
-
|
13
|
-
end
|
14
|
-
end
|