ar_lazy_preload 0.2.4 → 0.2.5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8e76eb3ed4d0d069552b4c805c82d0fb28829559fa63a70adeb81de0e8477409
4
- data.tar.gz: 6033b6faf439eeaccc02c525d00cb24bc80521c267ad4e4960b89cc9871506ca
3
+ metadata.gz: 7060cc83164f3fff3a468514246ecbb5799accc1999dab8581c97db4d10f016a
4
+ data.tar.gz: 98075d278f0d04fa68ae9b31ddc60e0348b6a896460f512bc27195113095e700
5
5
  SHA512:
6
- metadata.gz: 1b9b9658859f6b8a138735bcba398d2324671951480e861129530389ceefd242efa2266d08f4dea8d2b02905ab3ec18097629bb6c5a294c427531a903dc26caf
7
- data.tar.gz: c7bb4abcddefa8ab551b1fcb5a9eaab508fb02af7e1285ed419ba20e97dfac3cb3186149293d71bb0436e973656c2d03a73ee842063b4aa4a7942ec52aa6031c
6
+ metadata.gz: aad5db14a66fb29fa11cfbd2968e2b3dbd54110ee51f89d95ca6a5c9538125c46732a03d7d4539f3b1c251b2ae6a5c4c986b3a677d93bd76d6384c6e843c11bb
7
+ data.tar.gz: 482285553c6d4b1057e0d5ee173eef21f14a7e5c5214c093614ee3730677d3c32f0039b5b387da4b05023713b7868ae75b22d23cf18edd0200f1176fd6b78b4a
data/README.md CHANGED
@@ -6,6 +6,9 @@
6
6
 
7
7
  # ArLazyPreload
8
8
 
9
+ <a href="https://evilmartians.com/?utm_source=ar_lazy_preload">
10
+ <img src="https://evilmartians.com/badges/sponsored-by-evil-martians.svg" alt="Sponsored by Evil Martians" width="236" height="54"></a>
11
+
9
12
  Lazy loading associations for the ActiveRecord models. `#includes`, `#eager_load` and `#preload` are built-in methods to avoid N+1 problem, but sometimes when DB request is made we don't know what associations we are going to need later (for instance when your API allows client to define a list of loaded associations dynamically). The only possible solution for such cases is to load _all_ the associations we might need, but it can be a huge overhead.
10
13
 
11
14
  This gem allows to set up _lazy_ preloading for associations - it won't load anything until association is called for a first time, but when it happens - it loads all the associated records for all records from the initial relation in a single query.
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "set"
3
4
  require "ar_lazy_preload/associated_context_builder"
4
5
 
5
6
  module ArLazyPreload
@@ -34,11 +35,17 @@ module ArLazyPreload
34
35
 
35
36
  preloader.preload(records, association_name)
36
37
  AssociatedContextBuilder.prepare(parent_context: self, association_name: association_name)
38
+ # Our tracking of loading state
39
+ # Otherwise `#preload` will be called many times even when association is loaded
40
+ mark_association_as_loaded(association_name)
37
41
  end
38
42
 
39
43
  private
40
44
 
41
45
  def association_needs_preload?(association_name, node_tree = association_tree)
46
+ # Check whether association loading state
47
+ # to avoid calling preload unnecessarily
48
+ return false if association_loaded?(association_name)
42
49
  return true if ArLazyPreload.config.auto_preload?
43
50
 
44
51
  node_tree.any? do |node|
@@ -50,6 +57,18 @@ module ArLazyPreload
50
57
  end
51
58
  end
52
59
 
60
+ def mark_association_as_loaded(association_name)
61
+ loaded_association_names.add(association_name)
62
+ end
63
+
64
+ def association_loaded?(association_name)
65
+ loaded_association_names.include?(association_name)
66
+ end
67
+
68
+ def loaded_association_names
69
+ @loaded_association_names ||= Set.new
70
+ end
71
+
53
72
  def preloader
54
73
  @preloader ||= ActiveRecord::Associations::Preloader.new
55
74
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ArLazyPreload
4
- VERSION = "0.2.4"
4
+ VERSION = "0.2.5"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ar_lazy_preload
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 0.2.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - DmitryTsepelev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-11-21 00:00:00.000000000 Z
11
+ date: 2018-11-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec