predictive_load 0.1.1 → 0.1.2

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
  SHA1:
3
- metadata.gz: c06e8dd628fc0332e30ded32af6042aa499143be
4
- data.tar.gz: 0cef50d150b563becfd37449cb32f09425f6297b
3
+ metadata.gz: 9765b8681e6f08d2913adc2e00dd8543221e4104
4
+ data.tar.gz: 7c9efbb5370c71cf3209a534e8694ac698f6e282
5
5
  SHA512:
6
- metadata.gz: 8b84b9da822ee49efb981cfb1ecbab8456d48c7c495b4de0ba7689a5611205584b722097b33054eb8e2e6515044519a3c78188138379862d2c1a44b840a0a7fc
7
- data.tar.gz: 5188551f856d9827928b14a72bb667fab7b78e2868ac16af44c4c8695c2a2f890217dc56d3d8d5a8e6c72c1c67c55f90dd279308e0583287d8936c73e702e90f
6
+ metadata.gz: 36c715e1fc8d8e241e766fdf1fb2df3ca78505b10ca717cdb87f6164020a2527e40ba422657fc53b4dd3322f870b8ffe45879d099c13a7cb6aa9aab36240e034
7
+ data.tar.gz: c48502690d43a1a2b93d555fbbbb95bceac4e54d4c2048a570faf98c7bead3b5fb62995fedf624e02af1f9e00c7b566b3e95277a2828ef63cf45753b80461103
@@ -48,7 +48,7 @@ module PredictiveLoad::ActiveRecordCollectionObservation
48
48
 
49
49
  def notify_collection_observer
50
50
  if @owner.collection_observer
51
- @owner.collection_observer.loading_association(@owner, @reflection.name)
51
+ @owner.collection_observer.loading_association(@owner, self)
52
52
  end
53
53
  end
54
54
 
@@ -20,8 +20,10 @@ module PredictiveLoad
20
20
  end
21
21
  end
22
22
 
23
- def loading_association(record, association_name)
24
- if all_records_will_likely_load_association?(association_name)
23
+ def loading_association(record, association)
24
+ association_name = association.reflection.name
25
+
26
+ if all_records_will_likely_load_association?(association_name) && supports_preload?(association)
25
27
  preload(association_name)
26
28
  end
27
29
  end
@@ -34,6 +36,11 @@ module PredictiveLoad
34
36
  end
35
37
  end
36
38
 
39
+ def supports_preload?(association)
40
+ return false if association.reflection.options[:conditions].respond_to?(:to_proc)
41
+ true
42
+ end
43
+
37
44
  protected
38
45
 
39
46
  attr_reader :records
@@ -27,8 +27,10 @@ module PredictiveLoad
27
27
  @loaded_associations = {}
28
28
  end
29
29
 
30
- def loading_association(record, association_name)
30
+ def loading_association(record, association)
31
+ association_name = association.reflection.name
31
32
  return if !all_records_will_likely_load_association?(association_name)
33
+ return if !supports_preload?(association)
32
34
 
33
35
  if loaded_associations.key?(association_name)
34
36
  log_query_plan(association_name)
@@ -12,5 +12,5 @@ Gem::Specification.new do |gem|
12
12
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
13
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
14
  gem.name = "predictive_load"
15
- gem.version = '0.1.1'
15
+ gem.version = '0.1.2'
16
16
  end
data/test/loader_test.rb CHANGED
@@ -44,6 +44,14 @@ describe PredictiveLoad::Loader do
44
44
  end
45
45
  end
46
46
 
47
+ it "does not attempt to preload associations with proc conditions" do
48
+ comments = Comment.all
49
+ assert_equal 2, comments.size
50
+ assert_queries(2) do
51
+ comments.each { |comment| assert comment.user_by_proc.full_name }
52
+ end
53
+ end
54
+
47
55
  end
48
56
 
49
57
  describe "has_one" do
data/test/models.rb CHANGED
@@ -3,6 +3,11 @@ class User < ActiveRecord::Base
3
3
  has_many :topics, :through => :comments
4
4
  has_one :photo
5
5
  has_and_belongs_to_many :emails
6
+
7
+ def full_name
8
+ name
9
+ end
10
+
6
11
  end
7
12
 
8
13
  class Email < ActiveRecord::Base
@@ -14,10 +19,16 @@ end
14
19
 
15
20
  class Comment < ActiveRecord::Base
16
21
  belongs_to :user
22
+ belongs_to :user_by_proc, :class_name => "User", :foreign_key => :user_id,
23
+ :conditions => proc { "1 = #{one}" }
17
24
  belongs_to :topic
18
25
 
19
26
  scope :by_topic, lambda { |topic| where(:topic_id => topic.id) }
20
27
  scope :recent, order('updated_at desc')
28
+
29
+ def one
30
+ 1
31
+ end
21
32
  end
22
33
 
23
34
  class Photo < ActiveRecord::Base
data/test/watcher_test.rb CHANGED
@@ -57,14 +57,24 @@ predictive_load: would have prevented all 1 queries
57
57
 
58
58
  end
59
59
 
60
+ it "does not blow up when preloading associations with proc conditions" do
61
+ log = StringIO.new
62
+ logger = build_logger(log)
63
+ ActiveRecord::Base.logger = logger
64
+
65
+ comments = Comment.all
66
+ assert_equal 2, comments.size
67
+ assert_queries(2) do
68
+ comments.each { |comment| assert comment.user_by_proc.full_name }
69
+ end
70
+ end
71
+
60
72
  end
61
73
 
62
74
  def assert_log(message, gsub_pattern)
63
75
  original_logger = ActiveRecord::Base.logger
64
76
  log = StringIO.new
65
- logger = Logger.new(log)
66
- logger.level = Logger::Severity::INFO
67
- logger.formatter = proc { |severity, datetime, progname, msg| "#{msg}\n" }
77
+ logger = build_logger(log)
68
78
  ActiveSupport::LogSubscriber.colorize_logging = false
69
79
  ActiveRecord::Base.logger = logger
70
80
 
@@ -76,4 +86,11 @@ predictive_load: would have prevented all 1 queries
76
86
  ActiveRecord::Base.logger = original_logger
77
87
  end
78
88
 
89
+ def build_logger(log)
90
+ Logger.new(log).tap do |logger|
91
+ logger.level = Logger::Severity::INFO
92
+ logger.formatter = proc { |severity, datetime, progname, msg| "#{msg}\n" }
93
+ end
94
+ end
95
+
79
96
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: predictive_load
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eric Chapweske
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-01-07 00:00:00.000000000 Z
11
+ date: 2014-01-15 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Predictive loader
14
14
  email: