catstodon/app/models/poll_vote.rb
ThibG 96f905f409 Add optimistic lock to avoid race conditions when handling votes (#10196)
* Add optimistic lock to avoid race conditions when handling votes

* Force-reload polls when getting `ActiveRecord::StaleObjectError`
2019-03-06 19:53:57 +01:00

39 lines
833 B
Ruby

# frozen_string_literal: true
# == Schema Information
#
# Table name: poll_votes
#
# id :bigint(8) not null, primary key
# account_id :bigint(8)
# poll_id :bigint(8)
# choice :integer default(0), not null
# created_at :datetime not null
# updated_at :datetime not null
# uri :string
#
class PollVote < ApplicationRecord
belongs_to :account
belongs_to :poll, inverse_of: :votes
validates :choice, presence: true
validates_with VoteValidator
after_create_commit :increment_counter_cache
delegate :local?, to: :account
def object_type
:vote
end
private
def increment_counter_cache
poll.cached_tallies[choice] = (poll.cached_tallies[choice] || 0) + 1
poll.save
rescue ActiveRecord::StaleObjectError
poll.reload
retry
end
end