Стремительная загрузка делает что-то очень похожее на то, что вы делаете, но помимо простого запроса к базе данных, оно также устанавливает отношения. Когда вы извлекаете модель из базы данных, у которой есть связанные модели, связанные модели обычно загружаются по требованию. Пример из направляющих :
clients = Client.limit(10)
clients.each do |client|
puts client.address.postcode
end
Когда вы делаете первый запрос, происходит вызов в базу данных, чтобы получить десять клиентов. Когда вы выполняете их итерацию, чтобы получить почтовый индекс, связанный с адресом клиента (который предположительно находится в другой таблице), вам нужно будет выполнить еще 10 запросов, чтобы получить правильные адреса. Используя активную загрузку, вы можете выполнить все это всего за два запроса (которые обрабатываются под обложками).
clients = Client.includes(:address).limit(10)
Это захватывает десять клиентов, а затем выполняет другой запрос (аналогичный вашему), чтобы получить адреса, которые находятся в массиве client_id. Затем они хранятся в памяти с тактичными отношениями, поэтому вам не нужно делать еще один вызов из базы данных, чтобы получить их.
Если вы попытались повторить это, просто загрузив их отдельно:
clients = Client.limit(10)
addresses = Address.where("client_id in [my ID array]")
clients.each do |client|
puts client.address.postcode
end
Вы по-прежнему будете использовать базу данных для каждого из адресов, поскольку эти объекты не связаны друг с другом, кроме как через идентификаторы базы данных. Объекты загружены, но отношения между ними не создаются.