activerecord-precounter 0.3.3 → 0.4.0
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 +4 -4
- data/CHANGELOG.md +5 -0
- data/lib/active_record/precountable.rb +20 -0
- data/lib/active_record/precounter.rb +7 -5
- data/lib/active_record/precounter/version.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a80cb8c2919851956774b0c573d3a3271a9b4f017e33edca6fae411f1c4c189b
|
4
|
+
data.tar.gz: 9d479d623ceacf1a93ad4cc64b6ad58ce32f586e07dc8b6335d9e380f82e7d9b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ae135551e4619a121e488e62517c072b3692dd8b717867b45114ffe904ee50ad6cec6f3924755f511a48f640510d902986be83e0205b5b7178a054eae6d9b47d
|
7
|
+
data.tar.gz: 295507cafb1c6de872f92163d74ebfd37bae295cb2fe4478b3c313b967c0faf657090596fb37153a5a32ac5201be6c48b2384d697ca8901c98f4b0f1fe79da42
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
## v0.4.0
|
2
|
+
|
3
|
+
* [breaking] Raise `NotPrecountedError` instead of returning nil if `*_count` is called without precount
|
4
|
+
* Add `ActiveRecord::Precountable` module to actively define `*_count` readers and writers by `precounts` DSL on ActiveRecord::Base.
|
5
|
+
|
1
6
|
## v0.3.3
|
2
7
|
|
3
8
|
* Support passing a single record to `ActiveRecord::Precounter.new` [#8](https://github.com/k0kubun/activerecord-precounter/pull/8)
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module ActiveRecord
|
2
|
+
module Precountable
|
3
|
+
class NotPrecountedError < StandardError
|
4
|
+
end
|
5
|
+
|
6
|
+
def precounts(*association_names)
|
7
|
+
association_names.each do |association_name|
|
8
|
+
var_name = "#{association_name}_count"
|
9
|
+
instance_var_name = "@#{var_name}"
|
10
|
+
|
11
|
+
attr_writer(var_name)
|
12
|
+
define_method(var_name) do
|
13
|
+
count = instance_variable_get(instance_var_name)
|
14
|
+
raise NotPrecountedError.new("`#{association_name}' not precounted") unless count
|
15
|
+
count
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'active_record/precounter/version'
|
2
|
+
require 'active_record/precountable'
|
2
3
|
|
3
4
|
module ActiveRecord
|
4
5
|
class Precounter
|
@@ -47,7 +48,7 @@ module ActiveRecord
|
|
47
48
|
).count
|
48
49
|
end
|
49
50
|
|
50
|
-
writer = define_count_accessor(
|
51
|
+
writer = define_count_accessor(klass, association_name)
|
51
52
|
records.each do |record|
|
52
53
|
record.public_send(writer, count_by_id.fetch(record.public_send(primary_key), 0))
|
53
54
|
end
|
@@ -57,15 +58,16 @@ module ActiveRecord
|
|
57
58
|
|
58
59
|
private
|
59
60
|
|
60
|
-
# @param [
|
61
|
+
# @param [Class] record class
|
61
62
|
# @param [String] association_name
|
62
63
|
# @return [String] writer method name
|
63
|
-
def define_count_accessor(
|
64
|
+
def define_count_accessor(klass, association_name)
|
64
65
|
reader_name = "#{association_name}_count"
|
65
66
|
writer_name = "#{reader_name}="
|
66
67
|
|
67
|
-
if !
|
68
|
-
|
68
|
+
if !klass.method_defined?(reader_name) && !klass.method_defined?(writer_name)
|
69
|
+
klass.extend(ActiveRecord::Precountable)
|
70
|
+
klass.public_send(:precounts, association_name)
|
69
71
|
end
|
70
72
|
|
71
73
|
writer_name
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord-precounter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Takashi Kokubun
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-05-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -131,6 +131,7 @@ files:
|
|
131
131
|
- ci/Gemfile.activerecord-5.1.x
|
132
132
|
- ci/Gemfile.activerecord-5.2.x
|
133
133
|
- ci/travis.rb
|
134
|
+
- lib/active_record/precountable.rb
|
134
135
|
- lib/active_record/precounter.rb
|
135
136
|
- lib/active_record/precounter/version.rb
|
136
137
|
- lib/activerecord-precounter.rb
|
@@ -153,7 +154,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
153
154
|
- !ruby/object:Gem::Version
|
154
155
|
version: '0'
|
155
156
|
requirements: []
|
156
|
-
rubygems_version: 3.0.
|
157
|
+
rubygems_version: 3.2.0.pre1
|
157
158
|
signing_key:
|
158
159
|
specification_version: 4
|
159
160
|
summary: Yet Another N+1 COUNT Query Killer for ActiveRecord
|