bullet 2.2.1 → 2.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. data/.gitignore +1 -0
  2. data/.travis.yml +4 -1
  3. data/Gemfile +3 -2
  4. data/Gemfile.lock +85 -69
  5. data/Guardfile +8 -0
  6. data/lib/bullet.rb +13 -8
  7. data/lib/bullet/action_controller2.rb +4 -4
  8. data/lib/bullet/active_record2.rb +5 -6
  9. data/lib/bullet/active_record3.rb +2 -3
  10. data/lib/bullet/active_record31.rb +6 -8
  11. data/lib/bullet/detector/association.rb +27 -53
  12. data/lib/bullet/detector/counter.rb +34 -29
  13. data/lib/bullet/detector/n_plus_one_query.rb +47 -28
  14. data/lib/bullet/detector/unused_eager_association.rb +31 -30
  15. data/lib/bullet/notification/base.rb +14 -12
  16. data/lib/bullet/notification/n_plus_one_query.rb +6 -10
  17. data/lib/bullet/notification/unused_eager_loading.rb +1 -2
  18. data/lib/bullet/notification_collector.rb +1 -2
  19. data/lib/bullet/rack.rb +6 -3
  20. data/lib/bullet/registry/association.rb +4 -6
  21. data/lib/bullet/registry/base.rb +10 -7
  22. data/lib/bullet/registry/object.rb +6 -6
  23. data/lib/bullet/version.rb +1 -1
  24. data/perf/benchmark.rb +30 -12
  25. data/spec/bullet/detector/association_spec.rb +90 -0
  26. data/spec/bullet/detector/base_spec.rb +14 -0
  27. data/spec/bullet/detector/counter_spec.rb +65 -0
  28. data/spec/bullet/detector/n_plus_one_query_spec.rb +94 -0
  29. data/spec/bullet/detector/unused_eager_association_spec.rb +62 -0
  30. data/spec/bullet/notification/base_spec.rb +67 -0
  31. data/spec/bullet/notification/counter_cache_spec.rb +12 -0
  32. data/spec/bullet/notification/n_plus_one_query_spec.rb +13 -0
  33. data/spec/bullet/notification/unused_eager_loading_spec.rb +12 -0
  34. data/spec/bullet/notification_collector_spec.rb +32 -0
  35. data/spec/bullet/rack_spec.rb +80 -24
  36. data/spec/bullet/registry/association_spec.rb +26 -0
  37. data/spec/bullet/registry/base_spec.rb +44 -0
  38. data/spec/bullet/registry/object_spec.rb +25 -0
  39. data/spec/integration/association_for_chris_spec.rb +37 -0
  40. data/spec/integration/association_for_peschkaj_spec.rb +26 -0
  41. data/spec/{bullet → integration}/association_spec.rb +1 -359
  42. data/spec/integration/counter_spec.rb +37 -0
  43. data/spec/models/address.rb +3 -0
  44. data/spec/models/author.rb +3 -0
  45. data/spec/models/base_user.rb +5 -0
  46. data/spec/models/category.rb +7 -0
  47. data/spec/models/city.rb +3 -0
  48. data/spec/models/client.rb +4 -0
  49. data/spec/models/comment.rb +4 -0
  50. data/spec/models/company.rb +3 -0
  51. data/spec/models/contact.rb +3 -0
  52. data/spec/models/country.rb +3 -0
  53. data/spec/models/deal.rb +4 -0
  54. data/spec/models/document.rb +5 -0
  55. data/spec/models/email.rb +3 -0
  56. data/spec/models/entry.rb +3 -0
  57. data/spec/models/firm.rb +4 -0
  58. data/spec/models/folder.rb +2 -0
  59. data/spec/models/hotel.rb +4 -0
  60. data/spec/models/location.rb +3 -0
  61. data/spec/models/newspaper.rb +3 -0
  62. data/spec/models/page.rb +2 -0
  63. data/spec/models/person.rb +3 -0
  64. data/spec/models/pet.rb +3 -0
  65. data/spec/models/post.rb +11 -0
  66. data/spec/models/relationship.rb +4 -0
  67. data/spec/models/student.rb +3 -0
  68. data/spec/models/submission.rb +4 -0
  69. data/spec/models/teacher.rb +3 -0
  70. data/spec/models/user.rb +4 -0
  71. data/spec/models/writer.rb +2 -0
  72. data/spec/spec_helper.rb +16 -106
  73. data/spec/support/bullet_ext.rb +55 -0
  74. data/spec/support/rack_double.rb +55 -0
  75. data/spec/support/seed.rb +256 -0
  76. metadata +104 -14
  77. data/.watchr +0 -24
  78. data/spec/bullet/association_for_chris_spec.rb +0 -96
  79. data/spec/bullet/association_for_peschkaj_spec.rb +0 -86
  80. data/spec/bullet/counter_spec.rb +0 -136
data/.gitignore CHANGED
@@ -7,3 +7,4 @@ coverage.data
7
7
  tags
8
8
  .bundle
9
9
  *.gem
10
+ benchmark_profile*
@@ -1 +1,4 @@
1
- rvm: 1.9.2
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ env: DB=sqlite
data/Gemfile CHANGED
@@ -5,11 +5,12 @@ source "http://rubygems.org"
5
5
  gemspec
6
6
 
7
7
  gem 'rails'
8
- gem 'sqlite3-ruby', :require => 'sqlite3'
8
+ gem 'sqlite3'
9
9
  gem 'mysql'
10
10
  gem 'activerecord-import'
11
11
 
12
12
  gem "rspec"
13
- gem "watchr"
13
+ gem "guard"
14
+ gem "guard-rspec"
14
15
 
15
16
  gem "perftools.rb"
@@ -1,95 +1,110 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- bullet (2.2.1)
4
+ bullet (2.3.0)
5
5
  uniform_notifier (~> 1.0.0)
6
6
 
7
7
  GEM
8
8
  remote: http://rubygems.org/
9
9
  specs:
10
- abstract (1.0.0)
11
- actionmailer (3.0.11)
12
- actionpack (= 3.0.11)
13
- mail (~> 2.2.19)
14
- actionpack (3.0.11)
15
- activemodel (= 3.0.11)
16
- activesupport (= 3.0.11)
17
- builder (~> 2.1.2)
18
- erubis (~> 2.6.6)
19
- i18n (~> 0.5.0)
20
- rack (~> 1.2.1)
21
- rack-mount (~> 0.6.14)
22
- rack-test (~> 0.5.7)
23
- tzinfo (~> 0.3.23)
24
- activemodel (3.0.11)
25
- activesupport (= 3.0.11)
26
- builder (~> 2.1.2)
27
- i18n (~> 0.5.0)
28
- activerecord (3.0.11)
29
- activemodel (= 3.0.11)
30
- activesupport (= 3.0.11)
31
- arel (~> 2.0.10)
32
- tzinfo (~> 0.3.23)
33
- activerecord-import (0.2.5)
34
- activerecord (~> 3.0.0)
35
- activeresource (3.0.11)
36
- activemodel (= 3.0.11)
37
- activesupport (= 3.0.11)
38
- activesupport (3.0.11)
39
- arel (2.0.10)
40
- builder (2.1.2)
10
+ actionmailer (3.2.2)
11
+ actionpack (= 3.2.2)
12
+ mail (~> 2.4.0)
13
+ actionpack (3.2.2)
14
+ activemodel (= 3.2.2)
15
+ activesupport (= 3.2.2)
16
+ builder (~> 3.0.0)
17
+ erubis (~> 2.7.0)
18
+ journey (~> 1.0.1)
19
+ rack (~> 1.4.0)
20
+ rack-cache (~> 1.1)
21
+ rack-test (~> 0.6.1)
22
+ sprockets (~> 2.1.2)
23
+ activemodel (3.2.2)
24
+ activesupport (= 3.2.2)
25
+ builder (~> 3.0.0)
26
+ activerecord (3.2.2)
27
+ activemodel (= 3.2.2)
28
+ activesupport (= 3.2.2)
29
+ arel (~> 3.0.2)
30
+ tzinfo (~> 0.3.29)
31
+ activerecord-import (0.2.9)
32
+ activerecord (~> 3.0)
33
+ activerecord (~> 3.0)
34
+ activeresource (3.2.2)
35
+ activemodel (= 3.2.2)
36
+ activesupport (= 3.2.2)
37
+ activesupport (3.2.2)
38
+ i18n (~> 0.6)
39
+ multi_json (~> 1.0)
40
+ arel (3.0.2)
41
+ builder (3.0.0)
41
42
  diff-lcs (1.1.3)
42
- erubis (2.6.6)
43
- abstract (>= 1.0.0)
44
- i18n (0.5.0)
45
- json (1.6.3)
46
- mail (2.2.19)
47
- activesupport (>= 2.3.6)
43
+ erubis (2.7.0)
44
+ ffi (1.0.11)
45
+ guard (1.0.1)
46
+ ffi (>= 0.5.0)
47
+ thor (~> 0.14.6)
48
+ guard-rspec (0.6.0)
49
+ guard (>= 0.10.0)
50
+ hike (1.2.1)
51
+ i18n (0.6.0)
52
+ journey (1.0.3)
53
+ json (1.6.5)
54
+ mail (2.4.4)
48
55
  i18n (>= 0.4.0)
49
56
  mime-types (~> 1.16)
50
57
  treetop (~> 1.4.8)
51
- mime-types (1.17.2)
58
+ mime-types (1.18)
59
+ multi_json (1.1.0)
52
60
  mysql (2.8.1)
53
- perftools.rb (0.5.6)
61
+ perftools.rb (2.0.0)
54
62
  polyglot (0.3.3)
55
- rack (1.2.4)
56
- rack-mount (0.6.14)
57
- rack (>= 1.0.0)
58
- rack-test (0.5.7)
63
+ rack (1.4.1)
64
+ rack-cache (1.2)
65
+ rack (>= 0.4)
66
+ rack-ssl (1.3.2)
67
+ rack
68
+ rack-test (0.6.1)
59
69
  rack (>= 1.0)
60
- rails (3.0.11)
61
- actionmailer (= 3.0.11)
62
- actionpack (= 3.0.11)
63
- activerecord (= 3.0.11)
64
- activeresource (= 3.0.11)
65
- activesupport (= 3.0.11)
70
+ rails (3.2.2)
71
+ actionmailer (= 3.2.2)
72
+ actionpack (= 3.2.2)
73
+ activerecord (= 3.2.2)
74
+ activeresource (= 3.2.2)
75
+ activesupport (= 3.2.2)
66
76
  bundler (~> 1.0)
67
- railties (= 3.0.11)
68
- railties (3.0.11)
69
- actionpack (= 3.0.11)
70
- activesupport (= 3.0.11)
77
+ railties (= 3.2.2)
78
+ railties (3.2.2)
79
+ actionpack (= 3.2.2)
80
+ activesupport (= 3.2.2)
81
+ rack-ssl (~> 1.3.2)
71
82
  rake (>= 0.8.7)
72
83
  rdoc (~> 3.4)
73
- thor (~> 0.14.4)
84
+ thor (~> 0.14.6)
74
85
  rake (0.9.2.2)
75
- rdoc (3.11)
86
+ rdoc (3.12)
76
87
  json (~> 1.4)
77
- rspec (2.7.0)
78
- rspec-core (~> 2.7.0)
79
- rspec-expectations (~> 2.7.0)
80
- rspec-mocks (~> 2.7.0)
81
- rspec-core (2.7.1)
82
- rspec-expectations (2.7.0)
83
- diff-lcs (~> 1.1.2)
84
- rspec-mocks (2.7.0)
85
- sqlite3-ruby (1.3.2)
88
+ rspec (2.9.0)
89
+ rspec-core (~> 2.9.0)
90
+ rspec-expectations (~> 2.9.0)
91
+ rspec-mocks (~> 2.9.0)
92
+ rspec-core (2.9.0)
93
+ rspec-expectations (2.9.0)
94
+ diff-lcs (~> 1.1.3)
95
+ rspec-mocks (2.9.0)
96
+ sprockets (2.1.2)
97
+ hike (~> 1.2)
98
+ rack (~> 1.0)
99
+ tilt (~> 1.1, != 1.3.0)
100
+ sqlite3 (1.3.5)
86
101
  thor (0.14.6)
102
+ tilt (1.3.3)
87
103
  treetop (1.4.10)
88
104
  polyglot
89
105
  polyglot (>= 0.3.1)
90
- tzinfo (0.3.31)
106
+ tzinfo (0.3.32)
91
107
  uniform_notifier (1.0.1)
92
- watchr (0.7)
93
108
 
94
109
  PLATFORMS
95
110
  ruby
@@ -97,9 +112,10 @@ PLATFORMS
97
112
  DEPENDENCIES
98
113
  activerecord-import
99
114
  bullet!
115
+ guard
116
+ guard-rspec
100
117
  mysql
101
118
  perftools.rb
102
119
  rails
103
120
  rspec
104
- sqlite3-ruby
105
- watchr
121
+ sqlite3
@@ -0,0 +1,8 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ guard 'rspec', :version => 2, :all_after_pass => false, :all_on_start => false, :cli => "--color --format nested --fail-fast" do
5
+ watch(%r{^spec/.+_spec\.rb$})
6
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
7
+ watch('spec/spec_helper.rb') { "spec" }
8
+ end
@@ -1,10 +1,16 @@
1
1
  require 'set'
2
2
  require 'uniform_notifier'
3
3
 
4
+ class Object
5
+ def ar_key
6
+ "#{self.class}:#{self.id}"
7
+ end
8
+ end
9
+
4
10
  module Bullet
5
- if Rails.version =~ /^3\.0/
11
+ if Rails.version =~ /\A3\.0/
6
12
  autoload :ActiveRecord, 'bullet/active_record3'
7
- elsif Rails.version =~ /^3\.[12]/
13
+ elsif Rails.version =~ /\A3\.[12]/
8
14
  autoload :ActiveRecord, 'bullet/active_record31'
9
15
  else
10
16
  autoload :ActiveRecord, 'bullet/active_record2'
@@ -39,7 +45,7 @@ module Bullet
39
45
  @enable = enable
40
46
  if enable?
41
47
  Bullet::ActiveRecord.enable
42
- if Rails.version =~ /^2./
48
+ if Rails.version =~ /\A2./
43
49
  Bullet::ActionController.enable
44
50
  end
45
51
  end
@@ -51,7 +57,7 @@ module Bullet
51
57
 
52
58
  def bullet_logger=(active)
53
59
  if active
54
- bullet_log_file = File.open( 'log/bullet.log', 'a+' )
60
+ bullet_log_file = File.open('log/bullet.log', 'a+')
55
61
  bullet_log_file.sync
56
62
  UniformNotifier.customized_logger = bullet_log_file
57
63
  end
@@ -59,15 +65,15 @@ module Bullet
59
65
 
60
66
  def start_request
61
67
  notification_collector.reset
62
- DETECTORS.each {|bullet| bullet.start_request}
68
+ DETECTORS.each { |bullet| bullet.start_request }
63
69
  end
64
70
 
65
71
  def end_request
66
- DETECTORS.each {|bullet| bullet.end_request}
72
+ DETECTORS.each { |bullet| bullet.end_request }
67
73
  end
68
74
 
69
75
  def clear
70
- DETECTORS.each {|bullet| bullet.clear}
76
+ DETECTORS.each { |bullet| bullet.clear }
71
77
  end
72
78
 
73
79
  def notification_collector
@@ -104,5 +110,4 @@ module Bullet
104
110
  end
105
111
  end
106
112
  end
107
-
108
113
  end
@@ -2,8 +2,7 @@ module Bullet
2
2
  class ActionController
3
3
  def self.enable
4
4
  require 'action_controller'
5
- case Rails.version
6
- when /^2.3/
5
+ if Rails.version =~ /\A2.3/
7
6
  ::ActionController::Dispatcher.middleware.use Bullet::Rack
8
7
  ::ActionController::Dispatcher.class_eval do
9
8
  class <<self
@@ -14,7 +13,7 @@ module Bullet
14
13
  end
15
14
  end
16
15
  end
17
- when /^2.[2|1]/
16
+ elsif Rails.version =~ /\A2.[12]/
18
17
  ::ActionController::Dispatcher.class_eval do
19
18
  alias_method :origin_reload_application, :reload_application
20
19
  def reload_application
@@ -30,7 +29,8 @@ module Bullet
30
29
  response = origin_process(request, response, method = :perform_action, *arguments)
31
30
 
32
31
  if Bullet.notification?
33
- if response.headers["type"] and response.headers["type"].include? 'text/html' and response.body =~ %r{<html.*</html>}m
32
+ if response.headers["type"] && response.headers["type"].include?('text/html') &&
33
+ response.body.include?("<html>") && response.body.include?("</html>")
34
34
  response.body <<= Bullet.gather_inline_notifications
35
35
  response.headers["Content-Length"] = response.body.length.to_s
36
36
  end
@@ -1,5 +1,4 @@
1
1
  module Bullet
2
- LOAD_TARGET_RGX = /load_target/
3
2
  module ActiveRecord
4
3
  def self.enable
5
4
  require 'active_record'
@@ -11,7 +10,7 @@ module Bullet
11
10
  def find_every(options)
12
11
  records = origin_find_every(options)
13
12
 
14
- if records
13
+ if records
15
14
  if records.size > 1
16
15
  Bullet::Detector::Association.add_possible_objects(records)
17
16
  Bullet::Detector::Counter.add_possible_objects(records)
@@ -41,7 +40,7 @@ module Bullet
41
40
  end
42
41
  end
43
42
 
44
- ::ActiveRecord::Associations::ClassMethods.class_eval do
43
+ ::ActiveRecord::Associations::ClassMethods.class_eval do
45
44
  # add include in named_scope
46
45
  alias_method :origin_find_with_associations, :find_with_associations
47
46
  def find_with_associations(options)
@@ -75,19 +74,19 @@ module Bullet
75
74
  origin_load_target
76
75
  end
77
76
  end
78
-
77
+
79
78
  ::ActiveRecord::Associations::AssociationProxy.class_eval do
80
79
  # call has_one and belong_to association
81
80
  alias_method :origin_load_target, :load_target
82
81
  def load_target
83
82
  # avoid stack level too deep
84
83
  result = origin_load_target
85
- Bullet::Detector::NPlusOneQuery.call_association(@owner, @reflection.name) unless caller.find {|c| c =~ LOAD_TARGET_RGX }
84
+ Bullet::Detector::NPlusOneQuery.call_association(@owner, @reflection.name) unless caller.any? {|c| c.include?("load_target") }
86
85
  Bullet::Detector::Association.add_possible_objects(result)
87
86
  result
88
87
  end
89
88
  end
90
-
89
+
91
90
  ::ActiveRecord::Associations::HasManyAssociation.class_eval do
92
91
  alias_method :origin_has_cached_counter?, :has_cached_counter?
93
92
  def has_cached_counter?
@@ -1,5 +1,4 @@
1
1
  module Bullet
2
- LOAD_TARGET_RGX = /load_target/
3
2
  module ActiveRecord
4
3
  def self.enable
5
4
  require 'active_record'
@@ -69,14 +68,14 @@ module Bullet
69
68
  origin_load_target
70
69
  end
71
70
  end
72
-
71
+
73
72
  ::ActiveRecord::Associations::AssociationProxy.class_eval do
74
73
  # call has_one and belong_to association
75
74
  alias_method :origin_load_target, :load_target
76
75
  def load_target
77
76
  # avoid stack level too deep
78
77
  result = origin_load_target
79
- Bullet::Detector::NPlusOneQuery.call_association(@owner, @reflection.name) unless caller.find {|c| c =~ LOAD_TARGET_RGX }
78
+ Bullet::Detector::NPlusOneQuery.call_association(@owner, @reflection.name) unless caller.any? { |c| c.include?("load_target") }
80
79
  Bullet::Detector::Association.add_possible_objects(result)
81
80
  result
82
81
  end
@@ -1,5 +1,4 @@
1
1
  module Bullet
2
- LOAD_TARGET_RGX = /load_target/
3
2
  module ActiveRecord
4
3
  def self.enable
5
4
  require 'active_record'
@@ -70,13 +69,12 @@ module Bullet
70
69
  end
71
70
  end
72
71
 
73
- ::ActiveRecord::Associations::Association.class_eval do
74
- # call has_one and belong_to association
75
- alias_method :origin_load_target, :load_target
76
- def load_target
77
- # avoid stack level too deep
78
- result = origin_load_target
79
- Bullet::Detector::NPlusOneQuery.call_association(@owner, @reflection.name) unless caller.find {|c| c =~ LOAD_TARGET_RGX }
72
+ ::ActiveRecord::Associations::SingularAssociation.class_eval do
73
+ # call has_one and belongs_to associations
74
+ alias_method :origin_reader, :reader
75
+ def reader(force_reload = false)
76
+ result = origin_reader(force_reload)
77
+ Bullet::Detector::NPlusOneQuery.call_association(@owner, @reflection.name)
80
78
  Bullet::Detector::Association.add_possible_objects(result)
81
79
  result
82
80
  end
@@ -13,7 +13,6 @@ module Bullet
13
13
  # derive from Bullet::Detector::Association - changing the variable
14
14
  # in one subclass will make the change visible to all subclasses!
15
15
  @@object_associations = nil
16
- @@callers = nil
17
16
  @@possible_objects = nil
18
17
  @@impossible_objects = nil
19
18
  @@call_object_associations = nil
@@ -21,83 +20,62 @@ module Bullet
21
20
  end
22
21
 
23
22
  def add_object_associations(object, associations)
24
- object_associations.add( object, associations )
23
+ object_associations.add(object.ar_key, associations)
25
24
  end
26
25
 
27
26
  def add_call_object_associations(object, associations)
28
- call_object_associations.add( object, associations )
27
+ if object.id
28
+ call_object_associations.add(object.ar_key, associations)
29
+ end
29
30
  end
30
31
 
31
- def add_possible_objects(objects)
32
- possible_objects.add objects
32
+ def add_possible_objects(object_or_objects)
33
+ if object_or_objects.is_a? Array
34
+ object_or_objects.each { |object| possible_objects.add object.ar_key }
35
+ else
36
+ possible_objects.add object_or_objects.ar_key
37
+ end
33
38
  end
34
39
 
35
40
  def add_impossible_object(object)
36
- impossible_objects.add object
41
+ impossible_objects.add object.ar_key
37
42
  end
38
43
 
39
44
  def add_eager_loadings(objects, associations)
40
- objects = Array(objects)
45
+ object_ar_keys = Array(objects).map(&:ar_key)
41
46
 
42
47
  to_add = nil
43
48
  to_merge, to_delete = [], []
44
49
  eager_loadings.each do |k, v|
45
- key_objects_overlap = k & objects
50
+ key_objects_overlap = k & object_ar_keys
46
51
 
47
52
  next if key_objects_overlap.empty?
48
53
 
49
54
  if key_objects_overlap == k
50
55
  to_add = [k, associations]
51
56
  break
52
-
53
57
  else
54
58
  to_merge << [key_objects_overlap, ( eager_loadings[k].dup << associations )]
55
59
 
56
- keys_without_objects = k - objects
60
+ keys_without_objects = k - object_ar_keys
57
61
  to_merge << [keys_without_objects, eager_loadings[k]]
58
62
  to_delete << k
59
- objects = objects - k
63
+ object_ar_keys = object_ar_keys - k
60
64
  end
61
65
  end
62
- if to_add
63
- eager_loadings.add *to_add
64
- end
65
- to_merge.each do |k,val|
66
- eager_loadings.merge k, val
67
- end
68
- to_delete.each do |k|
69
- eager_loadings.delete k
70
- end
71
66
 
72
- eager_loadings.add objects, associations unless objects.empty?
67
+ eager_loadings.add *to_add if to_add
68
+ to_merge.each { |k,val| eager_loadings.merge k, val }
69
+ to_delete.each { |k| eager_loadings.delete k }
70
+
71
+ eager_loadings.add object_ar_keys, associations unless object_ar_keys.empty?
73
72
  end
74
73
 
75
74
  private
76
- def possible?(object)
77
- possible_objects.contains? object
78
- end
79
-
80
- def impossible?(object)
81
- impossible_objects.contains? object
82
- end
83
-
84
- # check if object => associations already exists in object_associations.
85
- def association?(object, associations)
86
- value = object_associations[object]
87
- if value
88
- value.each do |v|
89
- result = v.is_a?(Hash) ? v.has_key?(associations) : v == associations
90
- return true if result
91
- end
92
- end
93
-
94
- return false
95
- end
96
-
97
- # object_associations keep the object relationships
75
+ # object_associations keep the object relationships
98
76
  # that the object has many associations.
99
- # e.g. { <Post id:1> => [:comments] }
100
- # the object_associations keep all associations that may be or may no be
77
+ # e.g. { "Post:1" => [:comments] }
78
+ # the object_associations keep all associations that may be or may no be
101
79
  # unpreload associations or unused preload associations.
102
80
  def object_associations
103
81
  @@object_associations ||= Bullet::Registry::Base.new
@@ -105,7 +83,7 @@ module Bullet
105
83
 
106
84
  # call_object_assciations keep the object relationships
107
85
  # that object.associations is called.
108
- # e.g. { <Post id:1> => [:comments] }
86
+ # e.g. { "Post:1" => [:comments] }
109
87
  # they are used to detect unused preload associations.
110
88
  def call_object_associations
111
89
  @@call_object_associations ||= Bullet::Registry::Base.new
@@ -113,14 +91,14 @@ module Bullet
113
91
 
114
92
  # possible_objects keep the class to object relationships
115
93
  # that the objects may cause N+1 query.
116
- # e.g. { Post => [<Post id:1>, <Post id:2>] }
94
+ # e.g. { Post => ["Post:1", "Post:2"] }
117
95
  def possible_objects
118
96
  @@possible_objects ||= Bullet::Registry::Object.new
119
97
  end
120
98
 
121
99
  # impossible_objects keep the class to objects relationships
122
100
  # that the objects may not cause N+1 query.
123
- # e.g. { Post => [<Post id:1>, <Post id:2>] }
101
+ # e.g. { Post => ["Post:1", "Post:2"] }
124
102
  # Notice: impossible_objects are not accurate,
125
103
  # if find collection returns only one object, then the object is impossible object,
126
104
  # impossible_objects are used to avoid treating 1+1 query to N+1 query.
@@ -130,14 +108,10 @@ module Bullet
130
108
 
131
109
  # eager_loadings keep the object relationships
132
110
  # that the associations are preloaded by find :include.
133
- # e.g. { [<Post id:1>, <Post id:2>] => [:comments, :user] }
111
+ # e.g. { ["Post:1", "Post:2"] => [:comments, :user] }
134
112
  def eager_loadings
135
113
  @@eager_loadings ||= Bullet::Registry::Association.new
136
114
  end
137
-
138
- def callers
139
- @@callers ||= []
140
- end
141
115
  end
142
116
  end
143
117
  end