С реляционными данными, как предотвратить выполнение Rails запроса БД для каждого связанного значения? - PullRequest
1 голос
/ 26 мая 2020

Я не уверен, что заголовок моего вопроса действительно имеет смысл. Допустим, у меня есть две модели basi c: Artwork и Artiste. У художественного произведения один художник.

Когда я показываю свой список иллюстраций со следующим erb:

<% artworks.each do |artwork| %>
<p><%= artwork.title %></p>
<p><%= artwork.artiste.name %></p>
<% end %>

, я вижу, что Rails выполняет запрос к БД для каждого графического произведения, чтобы получить имя художника:

Журнал Puma:

  CACHE Artiste Load (0.0ms)  SELECT "artistes".* FROM "artistes" WHERE "artistes"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
  ↳ app/views/artworks/index.html.erb:55
  CACHE Artiste Load (0.0ms)  SELECT "artistes".* FROM "artistes" WHERE "artistes"."id" = $1 LIMIT $2  [["id", 5], ["LIMIT", 1]]
  ↳ app/views/artworks/index.html.erb:55
  CACHE Artiste Load (0.0ms)  SELECT "artistes".* FROM "artistes" WHERE "artistes"."id" = $1 LIMIT $2  [["id", 8], ["LIMIT", 1]]
  ↳ app/views/artworks/index.html.erb:55
  CACHE Artiste Load (0.0ms)  SELECT "artistes".* FROM "artistes" WHERE "artistes"."id" = $1 LIMIT $2  [["id", 6], ["LIMIT", 1]]
  ↳ app/views/artworks/index.html.erb:55

Думаю, это нормально для нескольких десятков произведений искусства, но не настолько, если этот стол вырастет ...

Есть ли чистое решение для предотвращения всех этих запросов? Заранее большое спасибо за вашу помощь.

1 Ответ

3 голосов
/ 26 мая 2020

класс c n+1 проблема. Вы должны стремиться загрузить записи artiste при запросе artworks.

@artworks = Artwork.includes(:artiste).all # or where or paginate

Подробности вы должны прочитать в этой статье .

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