module JamRuby class EmailBatchNewMusician < EmailBatchPeriodic BATCH_SIZE = 500 SINCE_WEEKS = 2 VAR_MUSICIAN_COUNT = "@MUSICIAN_COUNT" VAR_MUSICIAN_TABLE = "@MUSICIAN_TABLE" def self.subject "New musicians with good Internet connections to you have joined JamKazam!" end def fetch_recipients(since=nil) since ||= Time.now - SINCE_WEEKS.weeks User.geocoded_users .email_opt_in .where(['created_at < ?', since]) .find_in_batches(batch_size: EmailBatchNewMusician::BATCH_SIZE) do |users| new_musicians = users.inject({}) do |hh, uu| if 0 < (nearby = uu.nearest_musicians).count hh[uu] = nearby end hh end yield(new_musicians) if block_given? end end def deliver_batch_sets! self.opt_in_count = 0 sent = 0 self.fetch_recipients(self.time_since_last_batch(SINCE_WEEKS)) do |new_musicians| self.opt_in_count += new_musicians.count self.email_batch_sets << (bset = EmailBatchSet.load_set(self, new_musicians.keys.map(&:id))) new_musicians.each do |uu, nearby| UserMailer.new_musicians(uu, nearby).deliver sent += 1 end end self.sent_count = sent self.save self.did_batch_run! end end end