voteable_mongoid 0.6.4 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.rdoc CHANGED
@@ -1,15 +1,18 @@
1
+ == 0.7.0
2
+ * Use readable field names (up, down, up_count, down_count, count, point) instead of very short field names (u, d, uc, dc, c, p)
3
+
1
4
  == 0.6.4
2
5
  * Drop Voter#votees, Voter#up_votees, Voter#down_votees in favor of Voteable#voted_by(voter), Voteable#up_voted_by(voter), Voteable#down_voted_by(voter) scopes
3
-
6
+
4
7
  == 0.6.3
5
8
  * Add rake db:mongoid:voteable:migrate_old_votes to migrate vote data created by version < 0.6.0 to new vote data storage
6
9
 
7
10
  == 0.6.2
8
11
  * Fix bug: use before_create instead of after_after_initialize
9
-
12
+
10
13
  == 0.6.1
11
14
  * Set counters and point to 0 for uninitialized voteable objects in order sort and query
12
-
15
+
13
16
  == 0.6.0
14
17
  * Minimize vote data store (using short field names votes.u, votes.d, votes.c ...)
15
18
  * Add Voter#up_votees, Voter#down_votees
@@ -18,15 +21,15 @@
18
21
 
19
22
  == 0.5.0
20
23
  * Rename vote_point to voteable
21
-
24
+
22
25
  == 0.4.5
23
26
  * Can use rake db:mongoid:voteable:remake_stats in Rails apps
24
27
  * Use mongoid 2.0.0
25
-
28
+
26
29
  == 0.4.4
27
30
  * Add up_votes_count, down_votes_count
28
31
  * Re-generate vote statistic data (counters and point)
29
-
32
+
30
33
  == 0.4.3
31
34
  * Wrap vote data in voteable namespace (voteable.up_voters_id, voteable.down_voters_ids, voteable.votes_count ...)
32
35
 
data/README.rdoc CHANGED
@@ -3,8 +3,7 @@
3
3
  Voteable Mongoid allows you to make your Mongoid::Document objects voteable (up or down).
4
4
  For instance, in a forum, a user can vote up (or down) on a post or a comment.
5
5
 
6
- Voteable Mongoid is built for speed. It minimizes vote data storage and uses
7
- only one database request per collection to do both data validation and data update.
6
+ Voteable Mongoid is built for speed. It uses only one database request per collection to do both data validation and data update.
8
7
 
9
8
  Sample app at https://github.com/vinova/simple_qa
10
9
 
@@ -97,7 +96,7 @@ Rails
97
96
  Ruby
98
97
  Mongoid::Voteable::Stats.init
99
98
 
100
- === Migrate from version < 0.6.0
99
+ === Migrate from version < 0.7.0
101
100
  Rails
102
101
  rake db:mongoid:voteable:migrate_old_votes
103
102
  Ruby
@@ -1,3 +1,3 @@
1
1
  module VoteableMongoid
2
- VERSION = '0.6.4'
2
+ VERSION = '0.7.0'
3
3
  end
@@ -13,17 +13,17 @@ module Mongoid
13
13
 
14
14
  scope :voted_by, lambda { |voter|
15
15
  voter_id = voter.is_a?(BSON::ObjectId) ? voter : voter._id
16
- any_of({ UP_VOTER_IDS => voter_id }, { DOWN_VOTER_IDS => voter_id })
16
+ any_of({ 'votes.up' => voter_id }, { 'votes.down' => voter_id })
17
17
  }
18
18
 
19
19
  scope :up_voted_by, lambda { |voter|
20
20
  voter_id = voter.is_a?(BSON::ObjectId) ? voter : voter._id
21
- where( UP_VOTER_IDS => voter_id )
21
+ where( 'votes.up' => voter_id )
22
22
  }
23
23
 
24
24
  scope :down_voted_by, lambda { |voter|
25
25
  voter_id = voter.is_a?(BSON::ObjectId) ? voter : voter._id
26
- where( DOWN_VOTER_IDS => voter_id )
26
+ where( 'votes.down' => voter_id )
27
27
  }
28
28
 
29
29
  before_create do
@@ -67,21 +67,21 @@ module Mongoid
67
67
 
68
68
  klass = options[:class]
69
69
  klass ||= VOTEABLE.keys.include?(name) ? name : collection.name.classify
70
- value_point = VOTEABLE[klass][klass]
70
+ voteable = VOTEABLE[klass][klass]
71
71
 
72
72
  if options[:revote]
73
73
  if value == :up
74
- positive_voter_ids = UP_VOTER_IDS
75
- negative_voter_ids = DOWN_VOTER_IDS
76
- positive_votes_count = UP_VOTES_COUNT
77
- negative_votes_count = DOWN_VOTES_COUNT
78
- point_delta = value_point[:up] - value_point[:down]
74
+ positive_voter_ids = 'votes.up'
75
+ negative_voter_ids = 'votes.down'
76
+ positive_votes_count = 'votes.up_count'
77
+ negative_votes_count = 'votes.down_count'
78
+ point_delta = voteable[:up] - voteable[:down]
79
79
  else
80
- positive_voter_ids = DOWN_VOTER_IDS
81
- negative_voter_ids = UP_VOTER_IDS
82
- positive_votes_count = DOWN_VOTES_COUNT
83
- negative_votes_count = UP_VOTES_COUNT
84
- point_delta = -value_point[:up] + value_point[:down]
80
+ positive_voter_ids = 'votes.down'
81
+ negative_voter_ids = 'votes.up'
82
+ positive_votes_count = 'votes.down_count'
83
+ negative_votes_count = 'votes.up_count'
84
+ point_delta = -voteable[:up] + voteable[:down]
85
85
  end
86
86
 
87
87
  update_result = collection.update({
@@ -96,7 +96,7 @@ module Mongoid
96
96
  '$inc' => {
97
97
  positive_votes_count => +1,
98
98
  negative_votes_count => -1,
99
- VOTES_POINT => point_delta
99
+ 'votes.point' => point_delta
100
100
  }
101
101
  }, {
102
102
  :safe => true
@@ -104,13 +104,13 @@ module Mongoid
104
104
 
105
105
  elsif options[:unvote]
106
106
  if value == :up
107
- positive_voter_ids = UP_VOTER_IDS
108
- negative_voter_ids = DOWN_VOTER_IDS
109
- positive_votes_count = UP_VOTES_COUNT
107
+ positive_voter_ids = 'votes.up'
108
+ negative_voter_ids = 'votes.down'
109
+ positive_votes_count = 'votes.up_count'
110
110
  else
111
- positive_voter_ids = DOWN_VOTER_IDS
112
- negative_voter_ids = UP_VOTER_IDS
113
- positive_votes_count = DOWN_VOTES_COUNT
111
+ positive_voter_ids = 'votes.down'
112
+ negative_voter_ids = 'votes.up'
113
+ positive_votes_count = 'votes.down_count'
114
114
  end
115
115
 
116
116
  # Check if voter_id did a vote with value for votee_id
@@ -124,8 +124,8 @@ module Mongoid
124
124
  '$pull' => { positive_voter_ids => voter_id },
125
125
  '$inc' => {
126
126
  positive_votes_count => -1,
127
- VOTES_COUNT => -1,
128
- VOTES_POINT => -value_point[value]
127
+ 'votes.count' => -1,
128
+ 'votes.point' => -voteable[value]
129
129
  }
130
130
  }, {
131
131
  :safe => true
@@ -133,25 +133,25 @@ module Mongoid
133
133
 
134
134
  else # new vote
135
135
  if value.to_sym == :up
136
- positive_voter_ids = UP_VOTER_IDS
137
- positive_votes_count = UP_VOTES_COUNT
136
+ positive_voter_ids = 'votes.up'
137
+ positive_votes_count = 'votes.up_count'
138
138
  else
139
- positive_voter_ids = DOWN_VOTER_IDS
140
- positive_votes_count = DOWN_VOTES_COUNT
139
+ positive_voter_ids = 'votes.down'
140
+ positive_votes_count = 'votes.down_count'
141
141
  end
142
142
 
143
143
  update_result = collection.update({
144
144
  # Validate voter_id did not vote for votee_id yet
145
145
  :_id => votee_id,
146
- UP_VOTER_IDS => { '$ne' => voter_id },
147
- DOWN_VOTER_IDS => { '$ne' => voter_id }
146
+ 'votes.up' => { '$ne' => voter_id },
147
+ 'votes.down' => { '$ne' => voter_id }
148
148
  }, {
149
149
  # then update
150
150
  '$push' => { positive_voter_ids => voter_id },
151
151
  '$inc' => {
152
- VOTES_COUNT => +1,
152
+ 'votes.count' => +1,
153
153
  positive_votes_count => +1,
154
- VOTES_POINT => value_point[value] }
154
+ 'votes.point' => voteable[value] }
155
155
  }, {
156
156
  :safe => true
157
157
  })
@@ -163,7 +163,7 @@ module Mongoid
163
163
  update_result['n'] == 1 )
164
164
 
165
165
  if successed
166
- VOTEABLE[klass].each do |class_name, value_point|
166
+ VOTEABLE[klass].each do |class_name, voteable|
167
167
  # For other class in VOTEABLE options, if is parent of current class
168
168
  next unless relation_metadata = relations[class_name.underscore]
169
169
  next unless votee ||= options[:votee] || find(options[:votee_id])
@@ -174,36 +174,36 @@ module Mongoid
174
174
 
175
175
  if options[:revote]
176
176
  if value == :up
177
- inc_options[VOTES_POINT] = value_point[:up] - value_point[:down]
178
- unless value_point[:update_counters] == false
179
- inc_options[UP_VOTES_COUNT] = +1
180
- inc_options[DOWN_VOTES_COUNT] = -1
177
+ inc_options['votes.point'] = voteable[:up] - voteable[:down]
178
+ unless voteable[:update_counters] == false
179
+ inc_options['votes.up_count'] = +1
180
+ inc_options['votes.down_count'] = -1
181
181
  end
182
182
  else
183
- inc_options[VOTES_POINT] = -value_point[:up] + value_point[:down]
184
- unless value_point[:update_counters] == false
185
- inc_options[UP_VOTES_COUNT] = -1
186
- inc_options[DOWN_VOTES_COUNT] = +1
183
+ inc_options['votes.point'] = -voteable[:up] + voteable[:down]
184
+ unless voteable[:update_counters] == false
185
+ inc_options['votes.up_count'] = -1
186
+ inc_options['votes.down_count'] = +1
187
187
  end
188
188
  end
189
189
  elsif options[:unvote]
190
- inc_options[VOTES_POINT] = -value_point[value]
191
- unless value_point[:update_counters] == false
192
- inc_options[VOTES_COUNT] = -1
190
+ inc_options['votes.point'] = -voteable[value]
191
+ unless voteable[:update_counters] == false
192
+ inc_options['votes.count'] = -1
193
193
  if value == :up
194
- inc_options[UP_VOTES_COUNT] = -1
194
+ inc_options['votes.up_count'] = -1
195
195
  else
196
- inc_options[DOWN_VOTES_COUNT] = -1
196
+ inc_options['votes.down_count'] = -1
197
197
  end
198
198
  end
199
199
  else # new vote
200
- inc_options[VOTES_POINT] = value_point[value]
201
- unless value_point[:update_counters] == false
202
- inc_options[VOTES_COUNT] = 1
200
+ inc_options['votes.point'] = voteable[value]
201
+ unless voteable[:update_counters] == false
202
+ inc_options['votes.count'] = +1
203
203
  if value == :up
204
- inc_options[UP_VOTES_COUNT] = 1
204
+ inc_options['votes.up_count'] = +1
205
205
  else
206
- inc_options[DOWN_VOTES_COUNT] = 1
206
+ inc_options['votes.down_count'] = +1
207
207
  end
208
208
  end
209
209
  end
@@ -247,12 +247,12 @@ module Mongoid
247
247
 
248
248
  # Array of up voter ids
249
249
  def up_voter_ids
250
- votes.try(:[], 'u') || []
250
+ votes.try(:[], 'up') || []
251
251
  end
252
252
 
253
253
  # Array of down voter ids
254
254
  def down_voter_ids
255
- votes.try(:[], 'd') || []
255
+ votes.try(:[], 'down') || []
256
256
  end
257
257
  end
258
258
  end
@@ -5,28 +5,28 @@ module Mongoid
5
5
 
6
6
  # Get the number of up votes
7
7
  def up_votes_count
8
- votes.try(:[], 'uc') || 0
8
+ votes.try(:[], 'up_count') || 0
9
9
  end
10
10
 
11
11
  # Get the number of down votes
12
12
  def down_votes_count
13
- votes.try(:[], 'dc') || 0
13
+ votes.try(:[], 'down_count') || 0
14
14
  end
15
15
 
16
16
  # Get the number of votes
17
17
  def votes_count
18
- votes.try(:[], 'c') || 0
18
+ votes.try(:[], 'count') || 0
19
19
  end
20
20
 
21
21
  # Get the votes point
22
22
  def votes_point
23
- votes.try(:[], 'p') || 0
23
+ votes.try(:[], 'point') || 0
24
24
  end
25
25
 
26
26
  def self.init(log = false)
27
- VOTEABLE.each do |class_name, value_point|
27
+ VOTEABLE.each do |class_name, voteable|
28
28
  klass = class_name.constantize
29
- klass_value_point = value_point[class_name]
29
+ klass_voteable = voteable[class_name]
30
30
  puts "Init stats for #{class_name}" if log
31
31
  klass.collection.update({:votes => nil}, {
32
32
  '$set' => { :votes => VOTES_DEFAULT_ATTRIBUTES }
@@ -44,46 +44,46 @@ module Mongoid
44
44
  end
45
45
 
46
46
  def self.remake_stats(log)
47
- VOTEABLE.each do |class_name, value_point|
47
+ VOTEABLE.each do |class_name, voteable|
48
48
  klass = class_name.constantize
49
- klass_value_point = value_point[class_name]
49
+ klass_voteable = voteable[class_name]
50
50
  puts "Generating stats for #{class_name}" if log
51
51
  klass.all.each{ |doc|
52
- doc.remake_stats(klass_value_point)
52
+ doc.remake_stats(klass_voteable)
53
53
  }
54
54
  end
55
55
  end
56
56
 
57
- def remake_stats(value_point)
57
+ def remake_stats(voteable)
58
58
  up_count = up_voter_ids.length
59
59
  down_count = down_voter_ids.length
60
60
 
61
61
  update_attributes(
62
- UP_VOTES_COUNT => up_count,
63
- DOWN_VOTES_COUNT => down_count,
64
- VOTES_COUNT => up_count + down_count,
65
- VOTES_POINT => value_point[:up]*up_count + value_point[:down]*down_count
62
+ 'votes.up_count' => up_count,
63
+ 'votes.down_count' => down_count,
64
+ 'votes.count' => up_count + down_count,
65
+ 'votes.point' => voteable[:up]*up_count + voteable[:down]*down_count
66
66
  )
67
67
  end
68
68
 
69
69
  def self.update_parent_stats(log)
70
- VOTEABLE.each do |class_name, value_point|
70
+ VOTEABLE.each do |class_name, voteable|
71
71
  klass = class_name.constantize
72
- value_point.each do |parent_class_name, parent_value_point|
72
+ voteable.each do |parent_class_name, parent_voteable|
73
73
  relation_metadata = klass.relations[parent_class_name.underscore]
74
74
  if relation_metadata
75
75
  parent_class = parent_class_name.constantize
76
76
  foreign_key = relation_metadata.foreign_key
77
77
  puts "Updating stats for #{class_name} > #{parent_class_name}" if log
78
78
  klass.all.each{ |doc|
79
- doc.update_parent_stats(parent_class, foreign_key, parent_value_point)
79
+ doc.update_parent_stats(parent_class, foreign_key, parent_voteable)
80
80
  }
81
81
  end
82
82
  end
83
83
  end
84
84
  end
85
85
 
86
- def update_parent_stats(parent_class, foreign_key, value_point)
86
+ def update_parent_stats(parent_class, foreign_key, voteable)
87
87
  parent_id = read_attribute(foreign_key.to_sym)
88
88
  if parent_id
89
89
  up_count = up_voter_ids.length
@@ -92,19 +92,19 @@ module Mongoid
92
92
  return if up_count == 0 && down_count == 0
93
93
 
94
94
  inc_options = {
95
- VOTES_POINT => value_point[:up]*up_count + value_point[:down]*down_count
95
+ 'votes.point' => voteable[:up]*up_count + voteable[:down]*down_count
96
96
  }
97
97
 
98
- unless value_point[:update_counters] == false
98
+ unless voteable[:update_counters] == false
99
99
  inc_options.merge!(
100
- VOTES_COUNT => up_count + down_count,
101
- UP_VOTES_COUNT => up_count,
102
- DOWN_VOTES_COUNT => down_count
100
+ 'votes.count' => up_count + down_count,
101
+ 'votes.up_count' => up_count,
102
+ 'votes.down_count' => down_count
103
103
  )
104
104
  end
105
105
 
106
106
  parent_class.collection.update(
107
- { :_id => parent_id },
107
+ { '_id' => parent_id },
108
108
  { '$inc' => inc_options }
109
109
  )
110
110
  end
@@ -3,57 +3,55 @@ module Mongoid
3
3
 
4
4
  class Votes
5
5
  include Mongoid::Document
6
- field :u, :type => Array, :default => []
7
- field :d, :type => Array, :default => []
8
- field :uc, :type => Integer, :default => 0
9
- field :dc, :type => Integer, :default => 0
10
- field :c, :type => Integer, :default => 0
11
- field :p, :type => Integer, :default => 0
6
+ field :up, :type => Array, :default => []
7
+ field :down, :type => Array, :default => []
8
+ field :up_count, :type => Integer, :default => 0
9
+ field :down_count, :type => Integer, :default => 0
10
+ field :count, :type => Integer, :default => 0
11
+ field :point, :type => Integer, :default => 0
12
12
  end
13
-
14
- UP_VOTER_IDS = 'votes.u'
15
- DOWN_VOTER_IDS = 'votes.d'
16
- UP_VOTES_COUNT = 'votes.uc'
17
- DOWN_VOTES_COUNT = 'votes.dc'
18
- VOTES_COUNT = 'votes.c'
19
- VOTES_POINT = 'votes.p'
20
13
 
21
14
  VOTES_DEFAULT_ATTRIBUTES = Votes.new.attributes
22
15
  VOTES_DEFAULT_ATTRIBUTES.delete('_id')
23
16
 
24
17
  def self.migrate_old_votes(log = false)
25
- VOTEABLE.each do |class_name, value_point|
18
+ VOTEABLE.each do |class_name, voteable|
26
19
  klass = class_name.constantize
27
- klass_value_point = value_point[class_name]
20
+ klass_voteable = voteable[class_name]
28
21
  puts "* Migrating old vote data for #{class_name} ..." if log
29
- count = 0
22
+
30
23
  klass.all.each do |doc|
31
- next if doc['votes']
32
- count += 1
33
- up_voter_ids = doc['up_voter_ids'] || []
34
- down_voter_ids = doc['down_voter_ids'] || []
24
+ # Version 0.6.x use very short field names (u, d, uc, dc, c, p) to minimize
25
+ # votes storage but it's not human friendly
26
+ # Version >= 0.7.0 use readable field names (up, down, up_count, down_count,
27
+ # count, point)
28
+ votes = doc['votes'] || doc['voteable'] || {}
29
+ up_voter_ids = votes['u'] || votes['up'] || votes['up_voter_ids'] || doc['up_voter_ids'] || []
30
+ down_voter_ids = votes['d'] || votes['down'] || votes['down_voter_ids'] || doc['down_voter_ids'] || []
31
+
35
32
  up_count = up_voter_ids.size
36
33
  down_count = down_voter_ids.size
34
+
37
35
  klass.collection.update({ :_id => doc.id }, {
38
36
  '$set' => {
39
- :votes => {
40
- :u => doc.up_voter_ids,
41
- :d => doc.down_voter_ids,
42
- :uc => up_count,
43
- :dc => down_count,
44
- :c => up_count + down_count,
45
- :p => klass_value_point[:up]*up_count + klass_value_point[:down]*down_count
37
+ 'votes' => {
38
+ 'up' => up_voter_ids,
39
+ 'down' => down_voter_ids,
40
+ 'up_count' => up_count,
41
+ 'down_count' => down_count,
42
+ 'count' => up_count + down_count,
43
+ 'point' => klass_voteable[:up]*up_count + klass_voteable[:down]*down_count
46
44
  }
47
45
  },
48
46
  '$unset' => {
49
- :up_voter_ids => true,
50
- :down_voter_ids => true,
51
- :votes_count => true,
52
- :votes_point => true
47
+ 'up_voter_ids' => true,
48
+ 'down_voter_ids' => true,
49
+ 'votes_count' => true,
50
+ 'votes_point' => true,
51
+ 'voteable' => true
53
52
  }
54
53
  })
55
54
  end
56
- puts " #{count} objects migrated." if log
57
55
  end
58
56
  end
59
57
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: voteable_mongoid
3
3
  version: !ruby/object:Gem::Version
4
- hash: 15
4
+ hash: 3
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 6
9
- - 4
10
- version: 0.6.4
8
+ - 7
9
+ - 0
10
+ version: 0.7.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Alex Nguyen