Для этой настройки по умолчанию (не указано) 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