bodrovis/ChgkRating

View on GitHub
docs/loading_ru.md

Summary

Maintainability
Test Coverage
# "Ленивая" и принудительная загрузка данных

## "Ленивая" загрузка

Некоторые модели можно загрузить "ленивым" образом с помощью опции `lazy: true`.

```ruby
team = client.team 1, true # "Ленивая" загрузка команды с идентификатором 1
```

В указанном выше примере модель будет инстанцирована с единственным атрибутом `id` и **без отправки запроса к API**. Таким образом, мы инстанцируем команду без обращения к API. В каких случаях это может быть полезно? Например, вы можете использовать эту "ленивую" команду для вызова других методов относительно неё:

```ruby
team.ratings # Загружаем рейтинги команды
```

По большому счёту, для загрузки рейтингов команды не нужно загружать информацию о самой команде (её название, состав и т.п.), поэтому, используя описанный подход, мы сокращает количество отправляемых GET-запросов.

Обратите внимание, что в некоторых случаях ресурсы, ввиду особенностей API, будут автоматически загружены "лениво". Предположим, что мы хотим загрузить состав команды в определённом сезоне:

```ruby
client.recap 1, 9
``` 

В этом случае API вернёт только идентификаторы игроков, а не полную информацию о них: таким образом, каждый игрок будет загружен "лениво".

Если модель поддерживает "ленивую" загрузку, она имеет переменную `@lazy` и отвечает на метод `lazy`, возвращающий логическое значение (этот метод сообщает, была ли модель загружена "лениво"). Если "ленивая" загрузка не поддерживается, то метод  `lazy` недоступен, а константа `NO_LAZY_SUPPORT` устанавливается в значение `true`.

Некоторые коллекции также принимают параметр `lazy`, который пометит все модели этой коллекции как "лениво" загруженные. Тем не менее, даже если этот параметр указан при создании коллекции, запрос к API всё равно будет отправлен:

```ruby
client.players lazy: true
```

## Принудительная загрузка

Если есть "ленивая" загрузка, то должна быть и принудительная загрузка, так ведь? :) Этот тип загрузки используется для получения полной информации об указанной модели:

```ruby
player = client.player 1, true # "Лениво" загруженный игрок, имеющий только идентификатор
player.eager_load! # Принудительная загрузка полной информации об игроке
```

После того, как метод `#eager_load!` отработает, атрибут `@lazy` будет установлен в значение `false`, и все последующие вызовы `#eager_load!` не будут иметь никакого эффекта (информация не будет загружена повторно).

Если всё же необходимо повторно загрузить информацию для модели, то методу `.eager_load!` следует передать значение `true`:

```ruby
player.eager_load! true
```

В этом примере мы повторно загружаем полную информацию об игроке.

Принудительная загрузка полезна в тех случаях, когда модель автоматически создаётся "ленивым" способом. Вернёмся к примеру из предыдущего раздела:

```ruby
recap = client.recap 1, 9
players = recap.players # Коллекция "лениво" загруженных игроков
``` 

В этом примере `players` содержит коллекцию "лениво" загруженных игроков, так как API возвращает только их идентификаторы. Однако, мы можем легко получить полную информацию об интересующем нас игроке с помощью принудительной загрузки:

```ruby
players[3].eager_load!
```

Таким образом, мы получили полную информацию о четвёртом игроке.

Естественно, можно загрузить информацию обо всех игроках коллекции сразу:

```ruby
players.map &:eager_load!
```

Будьте осторожны, используя подобный подход, так как в некоторых случаях это может означать отправку очень большого количества запросов (например, если вы пытаетесь получить информацию обо всех игроках, когда-либо числившихся в составе команды).