voteable_mongoid 0.7.1 → 0.7.2

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.
data/CHANGELOG.rdoc CHANGED
@@ -1,3 +1,6 @@
1
+ == 0.7.2
2
+ * Use Collection#find_and_modify to retrieve updated votes data and parent_ids (don't need an extra query to get parent_ids)
3
+
1
4
  == 0.7.1
2
5
  * Refactor & cleanup source code
3
6
  * Better doc
@@ -1,3 +1,3 @@
1
1
  module VoteableMongoid
2
- VERSION = '0.7.1'
2
+ VERSION = '0.7.2'
3
3
  end
@@ -14,28 +14,43 @@ module Mongoid
14
14
  # - :unvote: unvote the vote value (:up or :down)
15
15
  def vote(options)
16
16
  options.symbolize_keys!
17
+ options[:votee_id] ||= options[:votee].id
17
18
  options[:votee_id] = BSON::ObjectId(options[:votee_id]) if options[:votee_id].is_a?(String)
18
19
  options[:voter_id] = BSON::ObjectId(options[:voter_id]) if options[:voter_id].is_a?(String)
19
20
  options[:value] = options[:value].to_sym
20
21
  options[:voteable] = VOTEABLE[name][name]
21
22
 
22
- update_parents = true
23
+ update_parents = options[:voteable][:update_parents]
23
24
 
24
25
  if options[:voteable]
25
- update_result = if options[:revote]
26
+ query, update = if options[:revote]
26
27
  revote(options)
27
28
  elsif options[:unvote]
28
29
  unvote(options)
29
30
  else
30
31
  new_vote(options)
31
32
  end
32
- # Only update parent votes if votee is updated successfully
33
- update_parents = ( update_result['err'] == nil and
34
- update_result['updatedExisting'] == true and
35
- update_result['n'] == 1 )
36
- end
37
33
 
38
- update_parent_votes(options) if update_parents
34
+ if options[:votee] || update_parents
35
+ # If votee exits or need to update parent
36
+ # use Collection#find_and_modify to retrieve updated votes data and parent_ids
37
+ begin
38
+ doc = collection.master.collection.find_and_modify(
39
+ :query => query,
40
+ :update => update,
41
+ :new => true
42
+ )
43
+ # Update new votes data
44
+ options[:votee].write_attribute('votes', doc['votes']) if options[:votee]
45
+ update_parent_votes(doc, options) if update_parents
46
+ rescue
47
+ # Don't update parents if operation fail or no matching object found
48
+ end
49
+ else
50
+ # Just update and don't care the result
51
+ collection.update(query, update)
52
+ end
53
+ end
39
54
  end
40
55
 
41
56
 
@@ -49,7 +64,7 @@ module Mongoid
49
64
  positive_votes_count = 'votes.down_count'
50
65
  end
51
66
 
52
- collection.update({
67
+ return {
53
68
  # Validate voter_id did not vote for votee_id yet
54
69
  :_id => options[:votee_id],
55
70
  'votes.up' => { '$ne' => options[:voter_id] },
@@ -61,9 +76,7 @@ module Mongoid
61
76
  'votes.count' => +1,
62
77
  positive_votes_count => +1,
63
78
  'votes.point' => options[:voteable][options[:value]] }
64
- }, {
65
- :safe => true
66
- })
79
+ }
67
80
  end
68
81
 
69
82
 
@@ -82,7 +95,7 @@ module Mongoid
82
95
  point_delta = -options[:voteable][:up] + options[:voteable][:down]
83
96
  end
84
97
 
85
- collection.update({
98
+ return {
86
99
  # Validate voter_id did a vote with value for votee_id
87
100
  :_id => options[:votee_id],
88
101
  positive_voter_ids => { '$ne' => options[:voter_id] },
@@ -96,9 +109,7 @@ module Mongoid
96
109
  negative_votes_count => -1,
97
110
  'votes.point' => point_delta
98
111
  }
99
- }, {
100
- :safe => true
101
- })
112
+ }
102
113
  end
103
114
 
104
115
 
@@ -113,10 +124,9 @@ module Mongoid
113
124
  positive_votes_count = 'votes.down_count'
114
125
  end
115
126
 
116
- # Check if voter_id did a vote with value for votee_id
117
- update_result = collection.update({
118
- # Validate voter_id did a vote with value for votee_id
127
+ return {
119
128
  :_id => options[:votee_id],
129
+ # Validate if voter_id did a vote with value for votee_id
120
130
  negative_voter_ids => { '$ne' => options[:voter_id] },
121
131
  positive_voter_ids => options[:voter_id]
122
132
  }, {
@@ -127,22 +137,19 @@ module Mongoid
127
137
  'votes.count' => -1,
128
138
  'votes.point' => -options[:voteable][options[:value]]
129
139
  }
130
- }, {
131
- :safe => true
132
- })
140
+ }
133
141
  end
134
142
 
135
143
 
136
- def update_parent_votes(options)
144
+ def update_parent_votes(doc, options)
137
145
  value = options[:value]
138
146
  votee ||= options[:votee]
139
147
 
140
148
  VOTEABLE[name].each do |class_name, voteable|
141
149
  # For other class in VOTEABLE options, if is parent of current class
142
150
  next unless relation_metadata = relations[class_name.underscore]
143
- votee ||= find(options[:votee_id])
144
151
  # If can find current votee foreign_key value for that class
145
- next unless foreign_key_value = votee.read_attribute(relation_metadata.foreign_key)
152
+ next unless foreign_key_value = doc[relation_metadata.foreign_key.to_s]
146
153
 
147
154
  class_name.constantize.collection.update(
148
155
  { '_id' => foreign_key_value },
@@ -44,8 +44,11 @@ module Mongoid
44
44
  # voteable self, :up => +1, :down => -3
45
45
  # voteable Post, :up => +2, :down => -1, :update_counters => false # skip counter update
46
46
  def voteable(klass = self, options = nil)
47
- VOTEABLE[self.name] ||= {}
48
- VOTEABLE[self.name][klass.name] ||= options
47
+ VOTEABLE[name] ||= {}
48
+ VOTEABLE[name][klass.name] ||= options
49
+ if klass != self
50
+ VOTEABLE[name][name][:update_parents] = true
51
+ end
49
52
  end
50
53
  end
51
54
 
@@ -76,8 +76,7 @@ describe Mongoid::Voteable do
76
76
 
77
77
  context 'user1 vote up post1 the first time' do
78
78
  before :all do
79
- Post.vote(:votee_id => @post1.id, :voter_id => @user1.id, :value => :up)
80
- @post1.reload
79
+ Post.vote(:votee => @post1, :voter_id => @user1.id, :value => :up)
81
80
  end
82
81
 
83
82
  it '' do
@@ -151,8 +150,7 @@ describe Mongoid::Voteable do
151
150
 
152
151
  context 'user1 vote down post2 the first time' do
153
152
  before :all do
154
- Post.vote(:votee_id => @post2.id, :voter_id => @user1.id, :value => :down)
155
- @post2.reload
153
+ @post2.vote(:voter_id => @user1.id, :value => :down)
156
154
  end
157
155
 
158
156
  it '' do
metadata CHANGED
@@ -1,13 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: voteable_mongoid
3
3
  version: !ruby/object:Gem::Version
4
- hash: 1
5
4
  prerelease:
6
- segments:
7
- - 0
8
- - 7
9
- - 1
10
- version: 0.7.1
5
+ version: 0.7.2
11
6
  platform: ruby
12
7
  authors:
13
8
  - Alex Nguyen
@@ -15,7 +10,8 @@ autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
12
 
18
- date: 2011-04-03 00:00:00 Z
13
+ date: 2011-04-04 00:00:00 +08:00
14
+ default_executable:
19
15
  dependencies:
20
16
  - !ruby/object:Gem::Dependency
21
17
  name: mongoid
@@ -25,11 +21,6 @@ dependencies:
25
21
  requirements:
26
22
  - - ~>
27
23
  - !ruby/object:Gem::Version
28
- hash: 15
29
- segments:
30
- - 2
31
- - 0
32
- - 0
33
24
  version: 2.0.0
34
25
  type: :runtime
35
26
  version_requirements: *id001
@@ -41,9 +32,6 @@ dependencies:
41
32
  requirements:
42
33
  - - ">="
43
34
  - !ruby/object:Gem::Version
44
- hash: 3
45
- segments:
46
- - 0
47
35
  version: "0"
48
36
  type: :development
49
37
  version_requirements: *id002
@@ -81,6 +69,7 @@ files:
81
69
  - spec/voteable_mongoid/voteable_spec.rb
82
70
  - spec/voteable_mongoid/voter_spec.rb
83
71
  - voteable_mongoid.gemspec
72
+ has_rdoc: true
84
73
  homepage: https://github.com/vinova/voteable_mongoid
85
74
  licenses: []
86
75
 
@@ -94,23 +83,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
94
83
  requirements:
95
84
  - - ">="
96
85
  - !ruby/object:Gem::Version
97
- hash: 3
98
- segments:
99
- - 0
100
86
  version: "0"
101
87
  required_rubygems_version: !ruby/object:Gem::Requirement
102
88
  none: false
103
89
  requirements:
104
90
  - - ">="
105
91
  - !ruby/object:Gem::Version
106
- hash: 3
107
- segments:
108
- - 0
109
92
  version: "0"
110
93
  requirements: []
111
94
 
112
95
  rubyforge_project: voteable_mongoid
113
- rubygems_version: 1.7.1
96
+ rubygems_version: 1.6.2
114
97
  signing_key:
115
98
  specification_version: 3
116
99
  summary: Add Up / Down Voting for Mongoid