voteable_mongoid 0.3.5 → 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.
@@ -22,8 +22,7 @@ module Mongoid
22
22
  def self.vote_point(klass = self, options = nil)
23
23
  VOTE_POINT[self.name] ||= {}
24
24
  VOTE_POINT[self.name][klass.name] ||= options
25
- end
26
-
25
+ end
27
26
 
28
27
  # We usually need to show current_user his voting value on voteable object
29
28
  # voting value can be nil (not voted yet), :up or :down
@@ -103,6 +102,48 @@ module Mongoid
103
102
  })
104
103
  end
105
104
  end
105
+
106
+ def self.unvote(options)
107
+ options.symbolize_keys!
108
+
109
+ voter_id = options[:voter_id]
110
+ voter_id = BSON::ObjectId(voter_id) if voter_id.is_a?(String)
111
+ votee_id = options[:votee_id]
112
+ votee_id = BSON::ObjectId(votee_id) if votee_id.is_a?(String)
113
+ value = options[:value].to_sym
114
+ return unless value # not voted yet!
115
+
116
+ value_point = VOTE_POINT[self.name][self.name]
117
+
118
+ pull_field = if value == :up
119
+ :up_voter_ids
120
+ else
121
+ :down_voter_ids
122
+ end
123
+
124
+ collection.update({
125
+ :_id => votee_id,
126
+ }, {
127
+ '$pull' => { pull_field => voter_id },
128
+ '$inc' => {
129
+ :votes_count => -1,
130
+ :votes_point => -value_point[value]
131
+ }
132
+ })
133
+
134
+ VOTE_POINT[self.name].each do |class_name, value_point|
135
+ next unless relation_metadata = relations[class_name.underscore]
136
+ next unless foreign_key_value = options[relation_metadata.foreign_key.to_sym]
137
+ foreign_key_value = BSON::ObjectId(foreign_key_value) if foreign_key_value.is_a?(String)
138
+
139
+ class_name.constantize.collection.update({ :_id => foreign_key_value }, {
140
+ '$inc' => {
141
+ :votes_count => value_point[:not_increase_votes_count] ? 0 : -1,
142
+ :votes_point => -value_point[value]
143
+ }
144
+ })
145
+ end
146
+ end
106
147
  end
107
148
 
108
149
 
@@ -118,7 +159,18 @@ module Mongoid
118
159
 
119
160
  self.class.vote(options)
120
161
  end
121
-
162
+
163
+ def unvote(options)
164
+ VOTE_POINT[self.class.name].each do |class_name, value_point|
165
+ next unless relation_metadata = relations[class_name.underscore]
166
+ next unless foreign_key = relation_metadata.foreign_key
167
+ options[foreign_key.to_sym] = read_attribute(foreign_key)
168
+ end
169
+
170
+ options[:votee_id] ||= _id
171
+ options[:value] = vote_value(options[:voter_id])
172
+ self.class.unvote(options)
173
+ end
122
174
 
123
175
  def vote_value(x)
124
176
  voter_id = case x
data/lib/mongoid/voter.rb CHANGED
@@ -25,7 +25,10 @@ module Mongoid
25
25
 
26
26
  votees(votee_class).where(:_id => votee_id).count == 1
27
27
  end
28
-
28
+
29
+ def unvote(votee)
30
+ votee.unvote(:voter_id => _id)
31
+ end
29
32
 
30
33
  def vote_value(options)
31
34
  votee = unless options.is_a?(Hash)
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: 25
4
+ hash: 15
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 3
9
- - 5
10
- version: 0.3.5
8
+ - 4
9
+ - 0
10
+ version: 0.4.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Alex Nguyen
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-02-17 00:00:00 +08:00
18
+ date: 2011-02-23 00:00:00 +08:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -173,8 +173,36 @@ dependencies:
173
173
  type: :development
174
174
  requirement: *id011
175
175
  - !ruby/object:Gem::Dependency
176
- name: mongoid
176
+ name: bson_ext
177
177
  version_requirements: &id012 !ruby/object:Gem::Requirement
178
+ none: false
179
+ requirements:
180
+ - - ">="
181
+ - !ruby/object:Gem::Version
182
+ hash: 3
183
+ segments:
184
+ - 0
185
+ version: "0"
186
+ prerelease: false
187
+ type: :development
188
+ requirement: *id012
189
+ - !ruby/object:Gem::Dependency
190
+ name: rspec
191
+ version_requirements: &id013 !ruby/object:Gem::Requirement
192
+ none: false
193
+ requirements:
194
+ - - ">="
195
+ - !ruby/object:Gem::Version
196
+ hash: 3
197
+ segments:
198
+ - 0
199
+ version: "0"
200
+ prerelease: false
201
+ type: :development
202
+ requirement: *id013
203
+ - !ruby/object:Gem::Dependency
204
+ name: mongoid
205
+ version_requirements: &id014 !ruby/object:Gem::Requirement
178
206
  none: false
179
207
  requirements:
180
208
  - - ~>
@@ -188,10 +216,10 @@ dependencies:
188
216
  version: 2.0.0.rc
189
217
  prerelease: false
190
218
  type: :runtime
191
- requirement: *id012
219
+ requirement: *id014
192
220
  - !ruby/object:Gem::Dependency
193
221
  name: bson_ext
194
- version_requirements: &id013 !ruby/object:Gem::Requirement
222
+ version_requirements: &id015 !ruby/object:Gem::Requirement
195
223
  none: false
196
224
  requirements:
197
225
  - - ">="
@@ -202,10 +230,10 @@ dependencies:
202
230
  version: "0"
203
231
  prerelease: false
204
232
  type: :development
205
- requirement: *id013
233
+ requirement: *id015
206
234
  - !ruby/object:Gem::Dependency
207
235
  name: rspec
208
- version_requirements: &id014 !ruby/object:Gem::Requirement
236
+ version_requirements: &id016 !ruby/object:Gem::Requirement
209
237
  none: false
210
238
  requirements:
211
239
  - - ">="
@@ -216,7 +244,7 @@ dependencies:
216
244
  version: "0"
217
245
  prerelease: false
218
246
  type: :development
219
- requirement: *id014
247
+ requirement: *id016
220
248
  description: Add Up / Down Voting for Mongoid
221
249
  email: alex@vinova.sg
222
250
  executables: []