Как зациклить в зависимости от количества результатов, возвращаемых в ruby - PullRequest
0 голосов
/ 19 января 2019

Я пытаюсь сделать так, чтобы я мог получить всю информацию из API.Мне нужно зациклить вызовы API, пока я не получу менее 1000 строк.проблема в том, что API возвращает только 1000 строк, и я понятия не имею, сколько строк он может отправить, однако я могу компенсировать каждый вызов API.

Я пытаюсь сделать так, чтобы API вызывался несколько рази возвращает все.ниже то, что я разработал до сих пор.

  response1 = External::getdataApi.call({country_ids: 'gb', extras: 'hotel_info'})
  response1 = response1.instance_variable_get(:@response)
  if response1['result'].count == 1000
    response1 = External::getdataApi.call({country_ids: 'gb', extras: 'hotel_info', offset: 1000})
  end

То, что должно произойти, это как только он вызывается, он должен затем вызывать снова, пока не получится менее 1000 результатов.В этот момент оставшиеся строки сохраняются, и затем он выходит из цикла.

Ответы [ 2 ]

0 голосов
/ 20 января 2019

Вы можете использовать цикл while, например:

offset = 0
end_reached = false

while !end_reached
    response1 = External::getdataApi.call({country_ids: 'gb', extras: 'hotel_info', offset: offset})
    response1 = response1.instance_variable_get(:@response)

    # increase offset by 1000
    offset += 1000

    # if result count is different from 1000 means the end was reached, set end_reached var to true so loop ends
    end_reached = true if response1['result'].count != 1000
end

или цикл until, например:

offset = 0
end_reached = false

until end_reached
    response1 = External::getdataApi.call({country_ids: 'gb', extras: 'hotel_info', offset: offset})
    response1 = response1.instance_variable_get(:@response)

    # increase offset by 1000
    offset += 1000

    # if result count is different from 1000 means the end was reached, set end_reached var to true so loop ends
    end_reached = true if response1['result'].count != 1000
end

Я предпочитаю последний, потому что думаючитается лучше

0 голосов
/ 19 января 2019

Вы можете использовать метод upto для Integer для достижения этой цели.Ваш код будет выглядеть примерно так:

MAX = 100 # or whatever is reasonable
1.upto(MAX) do |index|
  offset = index * 1000
  response1 = External::getdataApi.call({country_ids: 'gb', extras: 'hotel_info', offset: offset})
  response1 = response1.instance_variable_get(:@response)

  # process response

  break if response1['result'].count != 1000
end

Ruby 2.6 также имеет концепцию бесконечности , и вы можете вместо этого заменить 1.upto(MAX) на: (1..).each, если вы используете этоверсия.

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