/ / Ładowanie stronicowane zasobów w języku ruby ​​- ruby, pętle, koncepcyjne

Paged ładunek zasobów w ruby ​​- ruby, pętle, pojęciowy

Mam metodę, która może tylko załadować 50 obiektów na raz.

Więc wymyśliłem ten fragment kodu ruby, który będzie ładowany, dopóki nie będzie już żadnych wyników:

objects = []
offset = 0
limit = 50

loop do
# Load paged objects using the current given offset
new_objects = load_objects(some_url, limit: limit, start: offset)
offset += limit
objects.concat(new_objects)

# End the loop as soon as no more results are returned
break if new_objects.count == 0
end

Teraz, gdy to działa świetnie, zastanawiałem się, czy istnieje bardziej zwięzły sposób wykonania tego zadania w języku Ruby.

Aktualizacja: Myślę o niektórych collectpodejście podobne do tego:

# Pseudocode
objects = update_while_true([],0) do |result_array, limit|
new_objects = load_objects(some_url, limit: 50, start: current)
result_array.concat(new_objects)
limit += 50

# Should the loop be run again?
new_objects.count > 0
end

Odpowiedzi:

1 dla odpowiedzi № 1

Wyodrębniłbym to do metody, więc Twój kod wyglądałby tak:

limit = 50
objects = until_there_are_no_more_results do |offset|
load_objects(some_url, limit: limit, start: offset)
end

Wyodrębniona metoda zawierałaby bardzo ogólny kod, coś takiego (nieprzetestowane):

def until_there_are_no_more_results(&loader_proc)
objects = []
offset = 0

loop do
# Load paged objects using the current given offset
new_objects = loader_proc.call(offset) # or: yield(offset)
offset += limit
objects.concat(new_objects)

# End the loop as soon as no more results are returned
break if new_objects.count == 0
end

objects
end

Możesz pominąć parametr bloku i użyć yield jak poniżej, ale wolę mieć to w sygnaturze metody dla przejrzystości.

def until_there_are_no_more_results
#...
new_objects = yield(offset)