У меня есть for
l oop, который должен l oop через ключи объекта, и я заметил, что он, похоже, завершается на первой итерации. Мой контроллер инициализирует мой сервис с текущей датой и звонит parse_leads
. parse_leads
затем вызывает grouped_leads_by_location
и начинает цикл по возвращаемому объекту. Это l oop - тот, который, кажется, выходит на первой итерации.
# Controller
def generate_invite_texts
params[:signature] == ENV['TEMPORIZE_KEY'] ? valid = true : valid = false
if valid
p "Valid: generate invite texts, #{Time.current.in_time_zone('America/New_York')}"
SakariService.new(Time.current.in_time_zone('America/New_York').to_date).parse_leads
else
p "invalid key: generate invite texts"
end
head :ok
end
# SakariService.rb
class SakariService
include HTTParty
attr_reader :date
base_uri 'https://api.sakari.io'
def initialize(date, no_auth = false)
@options = {
headers: {
'Content-Type' => 'application/json'
}
}
@attempts = 0
@date = date.to_date.end_of_day
@potential_clients = PotentialClient.date_filter(@date.beginning_of_day, @date.end_of_day)
end
# ******************************************************************
# Begin functionality for scheduling the texts to be sent
# ******************************************************************
def parse_leads
grouped_leads_by_location.keys.each do |location_id|
p "LocationID: #{location_id}"
send_text_at = calc_send_time(location_id)
p "Send text at: #{send_text_at}"
schedule_text(send_text_at, location_id) if send_text_at.present?
end
end
# Adds two business days and 2 hours to date
def calc_send_time(location_id)
start_date_range = Date.current + 2.days
end_date_range = start_date_range + 4.days
date_range = ( start_date_range .. end_date_range )
location = Location.find(location_id)
p "start: #{start_date_range}"
p "end: #{end_date_range}"
p "range: #{date_range}"
date_range.each do |possible_date|
p "testing: #{possible_date}"
if !is_weekend?(possible_date) and !Location.is_holiday?(possible_date) and location.is_open_by_date?(possible_date)
time = location.get_open_time(possible_date) + 2.hours
send_text_at = Time.zone.parse("#{possible_date.strftime("%F")} #{time.strftime("%T")}")
return send_text_at
break
end
end
return nil
end
def grouped_leads_by_location
grouped_leads = @potential_clients \
.group_by { |pc| pc.location_id } \
.keep_if { |k, v| !k.nil? }
# outputs something like: { "1" => [#<PotentialClient:0x00000006cb1910> {...}, ...], "2" => [#<PotentialClient:0x00000006cb1910> {...}, ...]}
end
def schedule_text(datetime, location_id)
p "scheduling text: #{location_id} - #{datetime}"
datetime = datetime.to_datetime
SakariTextWorker.perform_at(datetime, @date, location_id)
end
end
В своих журналах я вижу следующее:
"Valid: generate invite texts, 2020-04-11"
"potential_clients"
D, [2020-04-11T04:56:02.562327 #4] DEBUG -- : [7b48a6db-0d4c-4dd2-9ed5-d436eab62e57] PotentialClient Load (5.7ms) SELECT "potential_clients".* FROM "potential_clients" WHERE (potential_clients.created_at >= '2020-04-11 04:00:00' and potential_clients.created_at <= '2020-04-12 03:59:59.999999')
"LocationID: 40"
D, [2020-04-11T04:56:02.564703 #4] DEBUG -- : [7b48a6db-0d4c-4dd2-9ed5-d436eab62e57] Location Load (0.7ms) SELECT "locations".* FROM "locations" WHERE "locations"."id" = $1 LIMIT $2 [["id", 40], ["LIMIT", 1]]
"start: 2020-04-13"
"end: 2020-04-17"
"range: 2020-04-13..2020-04-17"
"testing: 2020-04-13"
"Send text at: 2020-04-13 11:00:00 -0400"
"scheduling text: 40 - 2020-04-13 11:00:00 -0400"
Как видите, l oop работает для location_id
40 и затем никогда не продолжается. После повторного выполнения запроса grouped_leads_by_location.keys
возвращает ["40", "3", "42", "75", "1", "5", "2"]
, поэтому он должен был продолжаться. Есть идеи, почему это происходит?