Как обеспечить принудительную загрузку ассоциаций при импорте записей с использованием Searchkick с Rails4? - PullRequest
0 голосов
/ 24 августа 2018

Для этой настройки по умолчанию (не указано) search_data:

class Item < ActiveRecord::Base
 searchkick
 has_many :quantities, dependent: :destroy
 scope :search_import, -> { includes(:quantities) }

end

При импорте всех записей базы данных с помощью команды Item.reindex каждый «пакетный» загрузчик загружает количества для всех идентификаторов элементов, как и ожидалось.

Однако, если я хочу указать документ модели индекса иначе, чем атрибуты по умолчанию, используя метод search_data, включая связанные данные модели с чем-то вроде этого:

class Item < ActiveRecord::Base
 searchkick
 has_many :quantities, dependent: :destroy

 def search_data
   {
     part_number: standard_part_number,
     category_id: category_id.to_i,
     content_source_name: content_source_name,
     standard_price: standard_price.to_i,
     locations: quantities.map {|q| [q.location_code,
       quantity: q.value.to_i,
       bins: q.location_bins]
     }.to_h
   }
 end

 scope :search_import, -> { includes(:quantities) }

end

, где я работаю с quantities, используя map для определения атрибута locations, возвращаясь к импорту с использованием Item.reindex. Я вижу, что он не только активно загружает все связанные quantities каждой партии, но и затем он также загружает все quantities за item с обращением к базе данных снова для каждой записи item, которую он индексирует.

Я что-то упустил здесь, чтобы заставить Searchkick загружать модели quantities и иметь возможность настраивать запись данных поиска, используя уже загруженную ассоциированную модель, без повторного извлечения из базы данных за item?

Обновление Я определил, что что-то мешает тому, как ActiveRecord обычно отвечает на имя метода, используемое для связи с загруженными моделями в нашем приложении , и может быть не связано исключительно с нами, использующим Searchkick, хотя это действительно выявил проблему. Я не уверен, что мешает в данный момент, но это как-то связано с методом target в ассоциации. Возможно, установленный камень вызывает эту проблему. Мне удалось найти способ обойти это (пока), используя item.association(:quantities).target в качестве замены item.quantities, и теперь при запуске переиндексации он использует уже загруженную quantities и не попадает в БД снова для каждого item

1 Ответ

0 голосов
/ 30 августа 2018

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

Это ожидаемое поведение (и весьма вероятное выполнение), поскольку каждая партия будет отличаться quantities для загрузки, поскольку они подключаются к разным items, поэтому вам не нужно хранить все количества в памяти.

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

Это на самом деле неожиданно, но я предполагаю, что в одном из методов в Quantity (#location_code #value)или #location_bins) или даже один из методов на Item, который вы вызываете (#standard_part_number, #category_id, #content_source_name, #standard_price), существует некоторая реализация, которая требует перезагрузки записей.Не зная кода этих методов, он является чисто умозрительным, но представленная часть кода выглядит хорошо.

...