Skip to content

Instantly share code, notes, and snippets.

@jonstorer
Last active December 18, 2015 02:08
Show Gist options
  • Save jonstorer/5708340 to your computer and use it in GitHub Desktop.
Save jonstorer/5708340 to your computer and use it in GitHub Desktop.
pick crowd winners
class PickCrowdWinners
attr_accessor :crowd_drawing, :ids
def initialize(crowd_drawing)
@crowd_drawing = crowd_drawing
end
def ids
@ids ||= begin
ids = Set.new
key = CrowdMember.monthly_rank_key(crowd_drawing.brand_id, 1.month.ago)
entries_key = crowd_drawing.send(:entries_key)
number_of_entries = $redis.llen( entries_key )
number_of_prizes = crowd_drawing.prizes.map(&:quantity).sum
number_of_members = $redis.zcount(key, CrowdMember::POINTS_PER_ENTRY, '+inf')
number_of_winners = [number_of_prizes, number_of_members].min
progress = ProgressBar.create(:title => "#{crowd_drawing.brand.slug}", :total => number_of_winners, :format => '%t |%b[%P%%]%i| %c/%C [%E]')
while ids.size < number_of_winners
id = $redis.lindex(entries_key, rand(number_of_entries))
if CrowdMember.find(id).member.eligible_to_win?
progress.increment
ids << id
else
puts "#{id} is ineligible"
end
end
ids
end
end
def crowd_members
@crowd_members ||= CrowdMember.find(ids.to_a)
end
def run!
crowd_drawing.prizes.each do |prize|
crowd_members.shift(prize.quantity).each do |crowd_member|
PrizeWin.create({
:drawing_id => crowd_drawing.id,
:crowd_member_id => crowd_member.id,
:member_id => crowd_member.member_id,
:brand_id => crowd_drawing.brand_id,
:prize_id => prize.id,
:points => crowd_member.last_months_points_total,
:entries => crowd_member.last_months_entries
})
end
end
end
end
CrowdDrawing.last_month.each do |crowd_drawing|
wins = PrizeWin.between(:created_at => Time.now.utc.at_beginning_of_day..Time.now.utc).where(:drawing_id => crowd_drawing.id)
number_of_prizes = crowd_drawing.prizes.map(&:quantity).sum
number_of_winners = wins.count
diff = number_of_prizes - number_of_winners
if diff > 0
wins.destroy_all
PickCrowdWinners.new(crowd_drawing).run!
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment