Рельсы для l oop выход после первой итерации - PullRequest
1 голос
/ 13 апреля 2020

У меня есть 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"], поэтому он должен был продолжаться. Есть идеи, почему это происходит?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...