eager_group 0.4.0 → 0.5.0

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: 28f670fdfe6005404593f062ca54f9e415512779
4
- data.tar.gz: 2d744e1dfe87edcf0e9e800a33970c443de1a392
3
+ metadata.gz: 3ddfe7747a2b77e9f26cbbbb0029b41acb03b88b
4
+ data.tar.gz: 5357c3d44af2542594fc5ea593029cd3e3c5cc7e
5
5
  SHA512:
6
- metadata.gz: 7954ec79f25757d438d993395e3a0d17b2409ccd9cc7792886653d1bee8fb22c728924b9ca134aa9509aea7e92e378daf82d85035274efa5ee8e7a4bd7dbc977
7
- data.tar.gz: 62412a67a9401bd50ec7ee67c712aaf75010afaffb56a70a64c7eb8e4882f4ff54a7af9fcfb869c6f8d9f6b7bdb229a41a7e5829dbcd16c24af05c7773d90e0a
6
+ metadata.gz: 80419fb36e918d83f69487633330ffd607d806abaed2ff0a10ecd28134402968105c336aa31e90d361511dc717f3d3bfa3deb7a8a2892663e2a7efc7348ad862
7
+ data.tar.gz: ca82b49a3007370aebc5b3f2db9d85d51b3aeda6ee800a16dc20a3bda5a8b136c96bfbcfc7ffeb6523a110ef4083c20859ed0d31abb3cf6df4fe2b450d3d5c04
data/.travis.yml CHANGED
@@ -1,6 +1,6 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.2
3
+ - 2.3.0
4
4
  env:
5
5
  - DB=sqlite
6
6
  script: bundle exec rspec spec
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Next Release
2
2
 
3
+ ## 0.5.0 (09/22/2016)
4
+
5
+ * Add magic method for one record
6
+
3
7
  ## 0.4.0 (05/18/2016)
4
8
 
5
9
  * Support scope arguments
@@ -14,4 +18,4 @@
14
18
 
15
19
  ## 0.1.0 (06/29/2015)
16
20
 
17
- * first release
21
+ * First release
data/README.md CHANGED
@@ -87,6 +87,14 @@ when querying
87
87
  EagerGroup will execute `GROUP BY` sqls for you then set the value of
88
88
  attributes.
89
89
 
90
+ `define_eager_group` will define a method in model.
91
+ You can call the `definition_name` directly for convenience,
92
+ but it would not help you to fix n+1 aggregate sql issue.
93
+
94
+ post = Post.first
95
+ post.commets_average_rating
96
+ post.approved_comments_count
97
+
90
98
  ## Benchmark
91
99
 
92
100
  I wrote a benchmark script [here][1], it queries approved comments count
data/lib/eager_group.rb CHANGED
@@ -22,8 +22,26 @@ module EagerGroup
22
22
  self.send :attr_accessor, attr
23
23
  @eager_group_definations ||= {}
24
24
  @eager_group_definations[attr] = Definition.new association, aggregate_function, column_name, scope
25
+
26
+ define_method attr, -> (*args) do
27
+ query_result_cache = instance_variable_get("@#{attr}")
28
+ if args.blank? && query_result_cache.present?
29
+ return query_result_cache
30
+ end
31
+ preload_eager_group(attr, *args)
32
+ instance_variable_get("@#{attr}")
33
+ end
34
+
35
+ define_method "#{attr}=" do |val|
36
+ instance_variable_set("@#{attr}", val)
37
+ end
25
38
  end
26
39
  end
40
+
41
+ private
42
+ def preload_eager_group(*eager_group_value)
43
+ EagerGroup::Preloader.new(self.class, [self], [eager_group_value]).run
44
+ end
27
45
  end
28
46
 
29
47
  ActiveRecord::Base.send :include, EagerGroup
@@ -14,7 +14,7 @@ module EagerGroup
14
14
  defination_key, arguments = eager_group_value.is_a?(Array) ? [eager_group_value.shift, eager_group_value] : [eager_group_value, nil]
15
15
  if definition = @klass.eager_group_definations[defination_key]
16
16
  reflection = @klass.reflect_on_association(definition.association)
17
- association_class = reflection.class_name.constantize
17
+ association_class = reflection.klass
18
18
  association_class = association_class.instance_exec(*arguments, &definition.scope) if definition.scope
19
19
  polymophic_as_condition = lambda {|reflection|
20
20
  if reflection.type
@@ -1,3 +1,3 @@
1
1
  module EagerGroup
2
- VERSION = "0.4.0"
2
+ VERSION = "0.5.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: eager_group
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Richard Huang
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-05-16 00:00:00.000000000 Z
11
+ date: 2016-09-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler