counter_cache-rails 0.2.0 → 0.3.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: 0a301bec859d9975f7f3ae56d2cb8cdec25eaf88
4
- data.tar.gz: 1c6fd54aaeb967af245952fda02c38664f9f389e
3
+ metadata.gz: a0177b69e46bfbf965db0bcada7ad01d3a28dc21
4
+ data.tar.gz: 5012ff36ad9de6c329754120b63ac3766793e352
5
5
  SHA512:
6
- metadata.gz: 8b3f71843d81520b28fa6c181896b59bf92dd74bff620e84f88a5d762c127d1c519f0c59d4fee2752075ba592dd31aed03ccf2b65cc75077433ad40f58adfa42
7
- data.tar.gz: da0a571830ded5a810330aab215c9010bace1d5201a052041081bf7a0e8df1895fa200223de9b7e811e1fd15b40bad10fdd576a3cc05380446f3b7bbbfc8ba19
6
+ metadata.gz: b0f2fe3906b8fc859bc86760b321b8ffd2af53487930229ff5b1838b6cc971f95239f0514d9134ddbe0426185f6d2d9d7a8876ac034e2475603064bfb3fbfe59
7
+ data.tar.gz: 526ada510c6987f8b7a177e8444c7c58af18eddd193b7c37da2e8cf92b9946aad356e2dac0f92f0d076b06caabdc03a4b77705515c28ddfb79eec11e64085c5a
data/README.md CHANGED
@@ -15,7 +15,10 @@ gem 'counter_cache-rails'
15
15
  ```rb
16
16
  class Post
17
17
  has_many :comments
18
- counter_cache :comments
18
+
19
+ counter_cache :comments,
20
+ if: ->(comment) { comment.visible? },
21
+ scope: ->(comments) { comments.visible }
19
22
 
20
23
  after_update_comments_count do
21
24
  # you can use callbacks on update counter cache
@@ -1,2 +1,3 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'counter_cache_rails'
@@ -1,2 +1,16 @@
1
1
  # frozen_string_literal: true
2
+
3
+ require 'counter_cache_rails/configuration'
2
4
  require 'counter_cache_rails/railtie'
5
+
6
+ module CounterCacheRails
7
+ class << self
8
+ def configuration
9
+ @configuration ||= Configuration.new
10
+ end
11
+
12
+ def configure
13
+ yield configuration
14
+ end
15
+ end
16
+ end
@@ -1,28 +1,38 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module CounterCacheRails
3
4
  module ActiveRecordExtention
4
5
  extend ActiveSupport::Concern
5
6
 
6
7
  included do
7
- def self.counter_cache(tableized_model)
8
- class_name = self.to_s.downcase
9
- child_model_class = tableized_model.to_s.classify.constantize
8
+ # Enable counter cache for a child association
9
+ #
10
+ # @param tableized_model [Symbol] Name of the child association
11
+ # @param options [Hash]
12
+ # @option options [Proc] :if
13
+ # @option options [Proc] :unless
14
+ # @option options [Proc] :scope
15
+ def self.counter_cache(tableized_model, options = {})
16
+ class_name = self.to_s.downcase
17
+ child_model_class = tableized_model.to_s.classify.constantize
10
18
  tableized_child_model = tableized_model.to_sym
11
- primary_key = self.primary_key.to_sym
12
- callback_name = "update_#{tableized_child_model}_count".to_sym
19
+ primary_key = self.primary_key.to_sym
20
+ callback_name = "update_#{tableized_child_model}_count".to_sym
13
21
 
14
22
  define_model_callbacks callback_name
15
23
 
16
24
  define_method "#{tableized_child_model}_count" do |force: false|
17
-
18
25
  count = Rails.cache.read(_counter_cache_key(class_name, primary_key, tableized_child_model), raw: true)
19
26
 
20
27
  if count.nil? || force
21
- count = self.send(tableized_child_model).count
28
+ scope = options[:scope] ? options[:scope].call(self.send(tableized_child_model)) : self.send(tableized_child_model)
29
+ count = scope.count
30
+
22
31
  Rails.cache.write(
23
32
  self._counter_cache_key(class_name, primary_key, tableized_child_model),
24
33
  count,
25
- raw: true
34
+ raw: true,
35
+ expires_in: CounterCacheRails.configuration.expires_in,
26
36
  )
27
37
  end
28
38
 
@@ -42,19 +52,27 @@ module CounterCacheRails
42
52
  end
43
53
 
44
54
  after_create do
55
+ scope = options[:scope] ? options[:scope].call(self.send(tableized_child_model)) : self.send(tableized_child_model)
56
+
45
57
  Rails.cache.write(
46
58
  self._counter_cache_key(class_name, primary_key, tableized_child_model),
47
- self.send(tableized_child_model).count,
59
+ scope.count,
48
60
  raw: true
49
61
  )
50
62
  end
51
63
 
52
64
  child_model_class.class_eval do
53
65
  after_create do
66
+ next unless options[:if].nil? || options[:if].call(self)
67
+ next if !options[:unless].nil? && options[:unless].call(self)
68
+
54
69
  self.send(class_name.to_sym).send("_#{tableized_child_model}_count_incr")
55
70
  end
56
71
 
57
72
  after_destroy do
73
+ next unless options[:if].nil? || options[:if].call(self)
74
+ next if !options[:unless].nil? && options[:unless].call(self)
75
+
58
76
  self.send(class_name.to_sym).send("_#{tableized_child_model}_count_decr")
59
77
  end
60
78
  end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CounterCacheRails
4
+ class Configuration
5
+ attr_accessor :expires_in
6
+
7
+ def initialize(expires_in: nil)
8
+ @expires_in = expires_in
9
+ end
10
+ end
11
+ end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module CounterCacheRails
3
4
  class Railtie < ::Rails::Railtie
4
5
  initializer 'counter_cache-rails' do
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module CounterCacheRails
3
- VERSION = '0.2.0'
4
+ VERSION = '0.3.0'
4
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: counter_cache-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shota Iguchi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-01-17 00:00:00.000000000 Z
11
+ date: 2018-03-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -233,6 +233,7 @@ files:
233
233
  - lib/counter_cache-rails.rb
234
234
  - lib/counter_cache_rails.rb
235
235
  - lib/counter_cache_rails/active_record_extention.rb
236
+ - lib/counter_cache_rails/configuration.rb
236
237
  - lib/counter_cache_rails/railtie.rb
237
238
  - lib/counter_cache_rails/version.rb
238
239
  homepage: https://github.com/iguchi1124/counter_cache-rails