action-store 1.0.0 → 1.1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c50599726c2919bd3a8dc50ad0591150bad0c831e666dcefdca1ff2297159781
4
- data.tar.gz: fd867adfc5eee592b323379d1622ddc80f0f98e88e27e85c521ddd70171cf190
3
+ metadata.gz: 1d467de9d475a9a67d39dc4f7698be8b7a315d4a595e148c2a08f9ca3a5eff11
4
+ data.tar.gz: 9f82b594f99b6b7a2b27f4aa8f2abb9be2b3b46ad1f366d76a8f8a939b829828
5
5
  SHA512:
6
- metadata.gz: 99341754765a283b278ee0844e37a23bb50711d2a082b51c274b457a87a45e37f90b1ea2dadc4303d8a911a6d09bf3325f7e86e1cc127cbccb2100975cddd3b4
7
- data.tar.gz: f102b00586c9e18446876bf8de8b15d8003e326eb345fdc2835ceef1797421524fd2e4133477008f544d06a56e7f517e4db5f1c91052b8bcedc057cf2b15446e
6
+ metadata.gz: 3756a70605f0d4e51a06442b92df8706b776115b614ed8771e85ac4ce861a2acff69d7fcbe5d2e92622d17506ae209bc5561ff46abb5418bc85d8bd0dcce7f12
7
+ data.tar.gz: cadcd1a2f92975616885f446eda4530c5883bf0eccea64a28c41f94ccc38fa009b8713e5ffd67d513872449be7491afcb514eb7accd5c7775e7f3bd42bba3a75
@@ -1,11 +1,30 @@
1
- 1.1.0
2
- -----
1
+ ## 1.1.0
2
+
3
+ - Allows to configure different Models / Tables for store actions. (#16)
4
+
5
+ ```rb
6
+ # app/models/like.rb
7
+ class Like < Action
8
+ self.table_name = "likes"
9
+ end
10
+ ```
11
+
12
+ ```rb
13
+ # app/models/user.rb
14
+ class User < ActiveRecord::Base
15
+ action_store :like, :post, counter_cache: true, action_class_name: "Like"
16
+ action_store :like, :comment, counter_cache: true, action_class_name: "Like"
17
+ end
18
+ ```
19
+
20
+ ## 1.0.0
3
21
 
4
22
  - Require Rails >= 5.2.
5
23
  - Fix primary key for use `bigint` column type.
6
24
 
7
- 0.4.3
8
- -----
25
+ 0.4.3
26
+
27
+ ---
9
28
 
10
29
  - Auto reload `target`, when action/unaction target.
11
30
 
@@ -20,8 +39,7 @@ irb> post.likes_count
20
39
  => 0
21
40
  ```
22
41
 
23
- 0.4.2
24
- -----
42
+ ## 0.4.2
25
43
 
26
44
  - Add `UNIQUE INDEX` on `:action_type, :target_type, :target_id, :user_type, :user_id` for makesure action uniqueness.
27
45
  > NOTE! If you already have actions in database, the new migration may have issue on `db:migrate`,
@@ -38,25 +56,27 @@ $ rails g action_store:install
38
56
  Overwrite config/initializers/action_store.rb? (enter "h" for help) [Ynaqdhm] n
39
57
  skip config/initializers/action_store.rb
40
58
  Copied migration 20181121061544_add_unique_index_to_actions.action_store.rb from action_store
41
- ````
59
+ ```
42
60
 
43
- 0.3.3
44
- -----
61
+ ## 0.3.3
45
62
 
46
63
  - Fix for supports Rails 5.2;
47
64
 
48
- 0.3.2
49
- -----
65
+ 0.3.2
66
+
67
+ ---
50
68
 
51
69
  - Gem dependency for Rails 5.x.
52
70
 
53
- 0.3.1
54
- -----
71
+ 0.3.1
72
+
73
+ ---
55
74
 
56
75
  - Fix that `:user_counter_cache` was incorrect, it not count with target_type.
57
76
 
58
- 0.3.0
59
- -----
77
+ 0.3.0
78
+
79
+ ---
60
80
 
61
81
  - Fix for action_store in Model that not named `User`.
62
82
  - Fix has_many name when `User` model in a namespace.
@@ -78,8 +98,7 @@ end
78
98
  @blog_user.like_post(@post), @post.like_by_blog_users, @post.like_by_blog_user_actions
79
99
  ```
80
100
 
81
- 0.2.2
82
- -----
101
+ ## 0.2.2
83
102
 
84
103
  - Fix #2 support Target that under a namespace.
85
104
 
@@ -87,18 +106,19 @@ end
87
106
  action_store :like, :blog_post, class_name: 'Blog::Post'
88
107
  ```
89
108
 
90
- 0.2.1
91
- -----
109
+ ## 0.2.1
92
110
 
93
111
  - Use `ActiveSupport.on_load` to hook into Active Record.
94
112
 
95
- 0.2.0
96
- -----
113
+ 0.2.0
114
+
115
+ ---
97
116
 
98
117
  - New API, define action in User model.
99
118
  - Builtin Many-to-Many relations and methods.
100
119
 
101
- 0.1.0
102
- -----
120
+ 0.1.0
121
+
122
+ ---
103
123
 
104
124
  - First release.
data/README.md CHANGED
@@ -1,7 +1,6 @@
1
- ActionStore
2
- -----------
1
+ ## ActionStore
3
2
 
4
- [![Gem Version](https://badge.fury.io/rb/action-store.svg)](https://badge.fury.io/rb/action-store) [![Build Status](https://travis-ci.org/rails-engine/action-store.svg)](https://travis-ci.org/rails-engine/action-store) [![codecov.io](https://codecov.io/github/rails-engine/action-store/coverage.svg?branch=master)](https://codecov.io/github/rails-engine/action-store?branch=master)
3
+ [![Gem Version](https://badge.fury.io/rb/action-store.svg)](https://badge.fury.io/rb/action-store) [![build](https://github.com/rails-engine/action-store/workflows/build/badge.svg)](https://github.com/rails-engine/action-store/actions?query=workflow%3Abuild) [![codecov.io](https://codecov.io/github/rails-engine/action-store/coverage.svg?branch=master)](https://codecov.io/github/rails-engine/action-store?branch=master)
5
4
 
6
5
  Store different kinds of actions (Like, Follow, Star, Block, etc.) in a single table via ActiveRecord Polymorphic Associations.
7
6
 
@@ -17,10 +16,10 @@ And more and more.
17
16
 
18
17
  ## Basic table struct
19
18
 
20
- | Column | Description |
21
- | ----- | ----- |
22
- | `action_type` | The type of action [like, watch, follow, star, favorite] |
23
- | `action_option` | Secondary option for storing your custom status, or null if unneeded. |
19
+ | Column | Description |
20
+ | -------------------------- | --------------------------------------------------------------------------- |
21
+ | `action_type` | The type of action [like, watch, follow, star, favorite] |
22
+ | `action_option` | Secondary option for storing your custom status, or null if unneeded. |
24
23
  | `target_type`, `target_id` | Polymorphic Association for different `Target` models [User, Post, Comment] |
25
24
 
26
25
  ### Uniqueness
@@ -51,9 +50,8 @@ and run `rails db:migrate`.
51
50
 
52
51
  Use `action_store` to define actions:
53
52
 
54
- app/models/user.rb
55
-
56
53
  ```rb
54
+ # app/models/user.rb
57
55
  class User < ActiveRecord::Base
58
56
  action_store <action_type>, <target>, opts
59
57
  end
@@ -61,18 +59,18 @@ end
61
59
 
62
60
  #### Convention Over Configuration:
63
61
 
64
- | action, target | Target Model | Target `counter_cache_field` | User `counter_cache_field` | Target has_many | User has_many |
65
- |----------------|--------------|------------------------------|----------------------------|-----------------|---------------|
66
- | `action_store :like, :post` | `Post` | | | `has_many :like_by_user_actions`, `has_many :like_by_users` | `has_many :like_post_actions`, `has_many :like_posts` |
67
- | `action_store :like, :post, counter_cache: true` | `Post` | `likes_count` | | `has_many :like_by_user_actions`, `has_many :like_by_users` | `has_many :like_post_actions`, `has_many :like_posts` |
68
- | `action_store :star, :project, class_name: 'Repository'` | `Repository ` | `stars_count` | `star_projects_count` | `has_many :star_by_user_actions`, `has_many :star_by_users` |
69
- | `action_store :follow, :user` | `User` | `follows_count` | `follow_users_count` | `has_many :follow_by_user_actions`, `has_many :follow_by_users` | `has_many :follow_user_actions`, `has_many :follow_users` |
70
- | `action_store :follow, :user, counter_cache: 'followers_count', user_counter_cache: 'following_count'` | `User` | `followers_count ` | `following_count ` | `has_many :follow_by_user_actions`, `has_many :follow_by_users` | `has_many :follow_user_actions`, `has_many :follow_users` |
62
+ | action, target | Target Model | Target `counter_cache_field` | User `counter_cache_field` | Target has_many | User has_many |
63
+ | ------------------------------------------------------------------------------------------------------ | ------------- | ---------------------------- | -------------------------- | --------------------------------------------------------------- | --------------------------------------------------------- |
64
+ | `action_store :like, :post` | `Post` | | | `has_many :like_by_user_actions`, `has_many :like_by_users` | `has_many :like_post_actions`, `has_many :like_posts` |
65
+ | `action_store :like, :post, counter_cache: true` | `Post` | `likes_count` | | `has_many :like_by_user_actions`, `has_many :like_by_users` | `has_many :like_post_actions`, `has_many :like_posts` |
66
+ | `action_store :star, :project, class_name: 'Repository'` | `Repository ` | `stars_count` | `star_projects_count` | `has_many :star_by_user_actions`, `has_many :star_by_users` |
67
+ | `action_store :follow, :user` | `User` | `follows_count` | `follow_users_count` | `has_many :follow_by_user_actions`, `has_many :follow_by_users` | `has_many :follow_user_actions`, `has_many :follow_users` |
68
+ | `action_store :follow, :user, counter_cache: 'followers_count', user_counter_cache: 'following_count'` | `User` | `followers_count ` | `following_count ` | `has_many :follow_by_user_actions`, `has_many :follow_by_users` | `has_many :follow_user_actions`, `has_many :follow_users` |
71
69
 
72
70
  for example:
73
71
 
74
72
  ```rb
75
- # app/models/action.rb
73
+ # app/models/user.rb
76
74
  class User < ActiveRecord::Base
77
75
  action_store :like, :post, counter_cache: true
78
76
  action_store :star, :post, counter_cache: true, user_counter_cache: true
@@ -137,7 +135,7 @@ true
137
135
  irb> @user1.create_action(:follow, target: @user2)
138
136
  irb> @user1.reload.following_count
139
137
  => 1
140
- irb> @user2.reload.followers_count_
138
+ irb> @user2.reload.followers_count
141
139
  => 1
142
140
  irb> @user1.follow_user?(@user2)
143
141
  => true
@@ -181,6 +179,61 @@ irb> @issue.subscribe_by_user_actions.where(action_option: nil).count
181
179
  => 0
182
180
  ```
183
181
 
182
+ ## Use different tables for store actions.
183
+
184
+ > since 1.1.0
185
+
186
+ Sometimes, you may want to store actions into different table, for example, **Like** scenarios often have a lot of data, we wants store them into `likes` table.
187
+
188
+ Create a migration and model
189
+
190
+ ```bash
191
+ $ rails g migration create_likes
192
+ ```
193
+
194
+ And then modify this migration file to let this table have same struct like the `actions`
195
+
196
+ ```rb
197
+ class CreateLikes < ActiveRecord::Migration[6.1]
198
+ def change
199
+ create_table :likes do |t|
200
+ t.string :action_type, null: false
201
+ t.string :action_option
202
+ t.string :target_type
203
+ t.bigint :target_id
204
+ t.string :user_type
205
+ t.bigint :user_id
206
+
207
+ t.timestamps
208
+ end
209
+
210
+ add_index :likes, %i[user_type user_id action_type]
211
+ add_index :likes, %i[target_type target_id action_type]
212
+ add_index :likes, %i[action_type target_type target_id user_type user_id], unique: true, name: :uk_likes_target_user
213
+ end
214
+ end
215
+ ```
216
+
217
+ Create a `app/model/like.rb` model file:
218
+
219
+ ```rb
220
+ class Like < Action
221
+ self.table_name = "likes"
222
+ end
223
+ ```
224
+
225
+ And then change you `action_store` define to special some case to use Like model:
226
+
227
+ ```rb
228
+ # app/models/user.rb
229
+ class User < ActiveRecord::Base
230
+ action_store :like, :post, counter_cache: true, action_class_name: "Like"
231
+ action_store :like, :comment, counter_cache: true, action_class_name: "Like"
232
+ end
233
+ ```
234
+
235
+ Now, `user.like_post`, `user.like_comment` will store the actions into `likes` table.
236
+
184
237
  ## Built-in relations and methods
185
238
 
186
239
  When you call `action_store`, ActionStore will define many-to-many relations for User and Target models.
data/Rakefile CHANGED
@@ -16,7 +16,7 @@ RDoc::Task.new(:rdoc) do |rdoc|
16
16
  rdoc.rdoc_files.include("lib/**/*.rb")
17
17
  end
18
18
 
19
- APP_RAKEFILE = File.expand_path("../test/dummy/Rakefile", __FILE__)
19
+ APP_RAKEFILE = File.expand_path("test/dummy/Rakefile", __dir__)
20
20
  load "rails/tasks/engine.rake"
21
21
  load "rails/tasks/statistics.rake"
22
22
 
@@ -30,5 +30,4 @@ Rake::TestTask.new(:test) do |t|
30
30
  t.verbose = false
31
31
  end
32
32
 
33
-
34
33
  task default: :test
@@ -13,7 +13,7 @@ class CreateActions < ActiveRecord::Migration[5.2]
13
13
  t.timestamps
14
14
  end
15
15
 
16
- add_index :actions, [:user_type, :user_id, :action_type]
17
- add_index :actions, [:target_type, :target_id, :action_type]
16
+ add_index :actions, %i[user_type user_id action_type]
17
+ add_index :actions, %i[target_type target_id action_type]
18
18
  end
19
19
  end
@@ -1,5 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class AddUniqueIndexToActions < ActiveRecord::Migration[5.2]
2
4
  def change
3
- add_index :actions, [:action_type, :target_type, :target_id, :user_type, :user_id], unique: true, name: :uk_action_target_user
5
+ add_index :actions, %i[action_type target_type target_id user_type user_id], unique: true,
6
+ name: :uk_action_target_user
4
7
  end
5
8
  end
@@ -10,6 +10,7 @@ module ActionStore
10
10
  class << self
11
11
  def config
12
12
  return @config if defined?(@config)
13
+
13
14
  @config = Configuration.new
14
15
  @config
15
16
  end
@@ -33,32 +33,36 @@ module ActionStore
33
33
  end
34
34
  end
35
35
 
36
- def action_store(action_type, name, opts = {})
37
- opts ||= {}
38
- klass_name = opts[:class_name] || name.to_s.classify
39
- target_klass = klass_name.constantize
36
+ def action_store(action_type, name, class_name: nil, action_class_name: "Action", counter_cache: nil, user_counter_cache: nil)
37
+ name = name.to_s
38
+
39
+ class_name ||= name.classify
40
+ target_klass = class_name.constantize
41
+ action_klass = action_class_name.constantize
40
42
  action_type = action_type.to_s
41
- if opts[:counter_cache] == true
43
+ if counter_cache == true
42
44
  # @post.stars_count
43
- opts[:counter_cache] = "#{action_type.pluralize}_count"
45
+ counter_cache = "#{action_type.pluralize}_count"
44
46
  end
45
- if opts[:user_counter_cache] == true
47
+ if user_counter_cache == true
46
48
  # @user.star_posts_count
47
- opts[:user_counter_cache] = "#{action_type}_#{name.to_s.pluralize}_count"
49
+ user_counter_cache = "#{action_type}_#{name.pluralize}_count"
48
50
  end
49
51
 
50
52
  @defined_actions ||= []
51
53
  action = {
52
- action_name: name.to_s,
54
+ action_name: name,
53
55
  action_type: action_type,
56
+ action_klass: action_klass,
54
57
  target_klass: target_klass,
55
58
  target_type: target_klass.name,
56
- counter_cache: opts[:counter_cache],
57
- user_counter_cache: opts[:user_counter_cache]
59
+ counter_cache: counter_cache,
60
+ user_counter_cache: user_counter_cache
58
61
  }
59
62
  @defined_actions << action
60
63
 
61
- define_relations(action)
64
+ define_relations(action_klass: action_klass, target_klass: target_klass,
65
+ action_type: action_type, action_name: name)
62
66
  end
63
67
 
64
68
  def find_action(action_type, opts)
@@ -70,7 +74,7 @@ module ActionStore
70
74
  defined_action = find_defined_action(opts[:action_type], opts[:target_type])
71
75
  return nil if defined_action.nil?
72
76
 
73
- Action.find_by(where_opts(opts))
77
+ defined_action[:action_klass].find_by(where_opts(opts))
74
78
  end
75
79
 
76
80
  def create_action(action_type, opts)
@@ -84,11 +88,11 @@ module ActionStore
84
88
 
85
89
  # create! for raise RecordNotUnique
86
90
  begin
87
- action = Action.find_or_create_by!(where_opts(opts))
91
+ action = defined_action[:action_klass].find_or_create_by!(where_opts(opts))
88
92
  action.update(action_option: opts[:action_option]) if opts.key?(:action_option)
89
93
  rescue ActiveRecord::RecordNotUnique
90
94
  # update action_option on exist
91
- action = Action.where(where_opts(opts)).take
95
+ action = defined_action[:action_klass].where(where_opts(opts)).take
92
96
  action.update(action_option: opts[:action_option]) if opts.key?(:action_option)
93
97
  end
94
98
 
@@ -105,8 +109,9 @@ module ActionStore
105
109
  defined_action = find_defined_action(opts[:action_type], opts[:target_type])
106
110
  return false if defined_action.nil?
107
111
 
108
- action = Action.where(where_opts(opts)).first
109
- return true if !action
112
+ action = defined_action[:action_klass].where(where_opts(opts)).first
113
+ return true unless action
114
+
110
115
  action.destroy
111
116
  reset_counter_cache(action, defined_action)
112
117
  true
@@ -114,16 +119,18 @@ module ActionStore
114
119
 
115
120
  def reset_counter_cache(action, defined_action)
116
121
  return false if action.blank?
122
+
117
123
  if defined_action[:counter_cache] && action.target.present?
118
- target_count = Action.where(
124
+ target_count = defined_action[:action_klass].where(
119
125
  action_type: defined_action[:action_type],
120
126
  target_type: action.target_type,
121
127
  target_id: action.target_id
122
128
  ).count
123
129
  action.target.update_attribute(defined_action[:counter_cache], target_count)
124
130
  end
131
+
125
132
  if defined_action[:user_counter_cache] && action.user.present?
126
- user_count = Action.where(
133
+ user_count = defined_action[:action_klass].where(
127
134
  action_type: defined_action[:action_type],
128
135
  target_type: action.target_type,
129
136
  user_type: action.user_type,
@@ -134,105 +141,102 @@ module ActionStore
134
141
  end
135
142
 
136
143
  private
137
- def define_relations(action)
138
- target_klass = action[:target_klass]
139
- action_type = action[:action_type]
140
- action_name = action[:action_name]
141
-
142
- user_klass = self
143
-
144
- # user, person
145
- user_name = user_klass.table_name.underscore.singularize
146
-
147
- # like_topic, follow_user
148
- full_action_name = [action_type, action_name].join("_")
149
- # like_user, follow_user
150
- full_action_name_for_target = [action_type, "by", user_name].join("_")
151
- # unlike_topic, unfollow_user
152
- unaction_name = "un#{full_action_name}"
153
-
154
- # @target.like_topic_actions, @target.follow_user_actions
155
- has_many_name = [full_action_name, "actions"].join("_").to_sym
156
- # @target.like_topics, @target.follow_users
157
- has_many_through_name = full_action_name.pluralize.to_sym
158
-
159
- # @user.like_by_user_actions, @user.follow_by_user_actions
160
- has_many_name_for_target = [full_action_name_for_target, "actions"].join("_").to_sym
161
- # @user.like_by_users, @user.follow_by_users
162
- has_many_through_name_for_target = full_action_name_for_target.pluralize.to_sym
163
-
164
- has_many_scope = -> {
165
- where(action_type: action_type, target_type: target_klass.name, user_type: user_klass.name)
166
- }
167
-
168
- # User has_many :like_topic_actions
169
- user_klass.send :has_many, has_many_name, has_many_scope,
170
- class_name: "Action",
171
- foreign_key: "user_id"
172
- # User has_many :like_topics
173
- user_klass.send :has_many, has_many_through_name,
174
- through: has_many_name,
175
- source: :target,
176
- source_type: target_klass.name
177
-
178
- # Topic has_many :like_user_actions
179
- target_klass.send :has_many, has_many_name_for_target, has_many_scope,
180
- foreign_key: :target_id,
181
- class_name: "Action"
182
- # Topic has_many :like_users
183
- target_klass.send :has_many, has_many_through_name_for_target,
184
- through: has_many_name_for_target,
185
- source_type: user_klass.name,
186
- source: :user
187
-
188
- # @user.like_topic
189
- user_klass.send(:define_method, full_action_name) do |target_or_id|
190
- target_id = target_or_id.is_a?(target_klass) ? target_or_id.id : target_or_id
191
- result = user_klass.create_action(action_type, target_type: target_klass.name,
192
- target_id: target_id,
193
- user: self)
194
- target_or_id.reload if target_or_id.is_a?(target_klass)
195
- self.reload
196
- result
197
- end
198
-
199
- # @user.like_topic?
200
- user_klass.send(:define_method, "#{full_action_name}?") do |target_or_id|
201
- target_id = target_or_id.is_a?(target_klass) ? target_or_id.id : target_or_id
202
- result = user_klass.find_action(action_type, target_type: target_klass.name,
144
+
145
+ def define_relations(target_klass:, action_klass:, action_type:, action_name:)
146
+ user_klass = self
147
+
148
+ # user, person
149
+ user_name = user_klass.table_name.underscore.singularize
150
+
151
+ # like_topic, follow_user
152
+ full_action_name = [action_type, action_name].join("_")
153
+ # like_user, follow_user
154
+ full_action_name_for_target = [action_type, "by", user_name].join("_")
155
+ # unlike_topic, unfollow_user
156
+ unaction_name = "un#{full_action_name}"
157
+
158
+ # @target.like_topic_actions, @target.follow_user_actions
159
+ has_many_name = [full_action_name, "actions"].join("_").to_sym
160
+ # @target.like_topics, @target.follow_users
161
+ has_many_through_name = full_action_name.pluralize.to_sym
162
+
163
+ # @user.like_by_user_actions, @user.follow_by_user_actions
164
+ has_many_name_for_target = [full_action_name_for_target, "actions"].join("_").to_sym
165
+ # @user.like_by_users, @user.follow_by_users
166
+ has_many_through_name_for_target = full_action_name_for_target.pluralize.to_sym
167
+
168
+ has_many_scope = lambda {
169
+ where(action_type: action_type, target_type: target_klass.name, user_type: user_klass.name)
170
+ }
171
+
172
+ # User has_many :like_topic_actions
173
+ user_klass.send :has_many, has_many_name, has_many_scope,
174
+ class_name: action_klass.name,
175
+ foreign_key: "user_id"
176
+ # User has_many :like_topics
177
+ user_klass.send :has_many, has_many_through_name,
178
+ through: has_many_name,
179
+ source: :target,
180
+ source_type: target_klass.name
181
+
182
+ # Topic has_many :like_user_actions
183
+ target_klass.send :has_many, has_many_name_for_target, has_many_scope,
184
+ foreign_key: :target_id,
185
+ class_name: action_klass.name
186
+ # Topic has_many :like_users
187
+ target_klass.send :has_many, has_many_through_name_for_target,
188
+ through: has_many_name_for_target,
189
+ source_type: user_klass.name,
190
+ source: :user
191
+
192
+ # @user.like_topic
193
+ user_klass.send(:define_method, full_action_name) do |target_or_id|
194
+ target_id = target_or_id.is_a?(target_klass) ? target_or_id.id : target_or_id
195
+ result = user_klass.create_action(action_type, target_type: target_klass.name,
203
196
  target_id: target_id,
204
197
  user: self)
205
- result.present?
206
- end
207
-
208
- # @user.unlike_topic
209
- user_klass.send(:define_method, unaction_name) do |target_or_id|
210
- target_id = target_or_id.is_a?(target_klass) ? target_or_id.id : target_or_id
211
- result = user_klass.destroy_action(action_type, target_type: target_klass.name,
212
- target_id: target_id,
213
- user: self)
214
- target_or_id.reload if target_or_id.is_a?(target_klass)
215
- self.reload
216
- result
217
- end
198
+ target_or_id.reload if target_or_id.is_a?(target_klass)
199
+ reload
200
+ result
218
201
  end
219
202
 
220
- def safe_action_opts(opts)
221
- opts ||= {}
222
- if opts[:user]
223
- opts[:user_id] = opts[:user].id
224
- opts[:user_type] = opts[:user].class.name
225
- end
226
- if opts[:target]
227
- opts[:target_type] = opts[:target].class.name
228
- opts[:target_id] = opts[:target].id
229
- end
230
- opts
203
+ # @user.like_topic?
204
+ user_klass.send(:define_method, "#{full_action_name}?") do |target_or_id|
205
+ target_id = target_or_id.is_a?(target_klass) ? target_or_id.id : target_or_id
206
+ result = user_klass.find_action(action_type, target_type: target_klass.name,
207
+ target_id: target_id,
208
+ user: self)
209
+ result.present?
231
210
  end
232
211
 
233
- def where_opts(opts)
234
- opts.extract!(:action_type, :target_type, :target_id, :user_id, :user_type)
212
+ # @user.unlike_topic
213
+ user_klass.send(:define_method, unaction_name) do |target_or_id|
214
+ target_id = target_or_id.is_a?(target_klass) ? target_or_id.id : target_or_id
215
+ result = user_klass.destroy_action(action_type, target_type: target_klass.name,
216
+ target_id: target_id,
217
+ user: self)
218
+ target_or_id.reload if target_or_id.is_a?(target_klass)
219
+ reload
220
+ result
221
+ end
222
+ end
223
+
224
+ def safe_action_opts(opts)
225
+ opts ||= {}
226
+ if opts[:user]
227
+ opts[:user_id] = opts[:user].id
228
+ opts[:user_type] = opts[:user].class.name
229
+ end
230
+ if opts[:target]
231
+ opts[:target_type] = opts[:target].class.name
232
+ opts[:target_id] = opts[:target].id
235
233
  end
234
+ opts
235
+ end
236
+
237
+ def where_opts(opts)
238
+ opts.extract!(:action_type, :target_type, :target_id, :user_id, :user_type)
239
+ end
236
240
  end
237
241
  end
238
242
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ActionStore
4
- VERSION = "1.0.0"
4
+ VERSION = "1.1.0"
5
5
  end
@@ -5,7 +5,7 @@ module ActionStore
5
5
  module Generators
6
6
  class InstallGenerator < Rails::Generators::Base
7
7
  desc "Create ActionStore's base files"
8
- source_root File.expand_path("../../../../", __FILE__)
8
+ source_root File.expand_path("../../..", __dir__)
9
9
 
10
10
  def add_initializer
11
11
  template "config/initializers/action_store.rb", "config/initializers/action_store.rb"
metadata CHANGED
@@ -1,11 +1,11 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: action-store
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jason Lee
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
  date: 2017-02-04 00:00:00.000000000 Z
@@ -31,7 +31,7 @@ dependencies:
31
31
  - !ruby/object:Gem::Version
32
32
  version: '7'
33
33
  - !ruby/object:Gem::Dependency
34
- name: mysql2
34
+ name: codecov
35
35
  requirement: !ruby/object:Gem::Requirement
36
36
  requirements:
37
37
  - - ">="
@@ -59,7 +59,7 @@ dependencies:
59
59
  - !ruby/object:Gem::Version
60
60
  version: '0'
61
61
  - !ruby/object:Gem::Dependency
62
- name: simplecov
62
+ name: pg
63
63
  requirement: !ruby/object:Gem::Requirement
64
64
  requirements:
65
65
  - - ">="
@@ -73,7 +73,7 @@ dependencies:
73
73
  - !ruby/object:Gem::Version
74
74
  version: '0'
75
75
  - !ruby/object:Gem::Dependency
76
- name: codecov
76
+ name: simplecov
77
77
  requirement: !ruby/object:Gem::Requirement
78
78
  requirements:
79
79
  - - ">="
@@ -112,7 +112,7 @@ homepage: https://github.com/rails-engine/action-store
112
112
  licenses:
113
113
  - MIT
114
114
  metadata: {}
115
- post_install_message:
115
+ post_install_message:
116
116
  rdoc_options: []
117
117
  require_paths:
118
118
  - lib
@@ -127,8 +127,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
127
127
  - !ruby/object:Gem::Version
128
128
  version: '0'
129
129
  requirements: []
130
- rubygems_version: 3.0.3
131
- signing_key:
130
+ rubygems_version: 3.1.4
131
+ signing_key:
132
132
  specification_version: 4
133
133
  summary: Store difference kind of actions (Like, Follow, Star, Block ...) in one table.
134
134
  test_files: []