ActiveRecord :: Ассоциации :: Preloader предварительно загружает только некоторые отношения - PullRequest
0 голосов
/ 08 февраля 2019

Я использую find_by_sql, а затем ActiveRecord :: Associations :: Preloader для предварительной загрузки нескольких отношений.Я вижу в консоли, что он предварительно загружает отношения, но по какой-то причине он все еще лениво загружает часть связанных записей во время вызова as_json.

В этом конкретном случае find_by_sql вернул массив из 1872 моделей,Каждая модель должна иметь хотя бы одну модель связанных деталей.Я использовал приведенный ниже код для предварительной загрузки ассоциаций

preload = [
  details: %i[account department]
]
ActiveRecord::Associations::Preloader.new.preload(results, preload)

Чтобы проверить, все ли ассоциации предварительно загружены, я использовал приведенный ниже код

results.select{|r| r.association(:details).loaded? == false}.length
2
results.find_index{|r| r.association(:details).loaded? == false}
192

. Интересно, по какой-то причине предварительный загрузчик будет толькопредварительно загрузить фиксированное количество записей, но индекс записей, которые не были загружены, не были друг с другом или к одному концу массива результатов.Они были по индексам 192 и 472.

Вот мой код as_json

json = results.as_json(
  include: [
    details: {include: %i[department account]}
  ]
)

Есть ли какая-то причина, по которой он предварительно загружает только некоторые отношения.Если я передаю различные параметры поиска в find_by_sql, он возвращает больше моделей, больше предварительно загруженных отношений и больше отношений, которые не были предварительно загружены.Если я использую параметры поиска, которые возвращают небольшое количество моделей, все предварительно загружено.

1 Ответ

0 голосов
/ 09 февраля 2019

Я обнаружил, что массив результатов содержал одну и ту же модель дважды из-за условия соединения в моем SQL.Rails только предварительно загруженные ассоциации для одной из дублирующих моделей.

...