Индексирование связанных моделей с помощью Solr Sunspot - Rails

У меня 4 модели. Product, ProductMachines (соединяет таблицу с атрибутом номера детали), Machine и Brand. По сути, таблица Product принадлежит многим Machines. Машина принадлежит Brand. Эта структура позволяет мне связать продукт с разными машинами разных марок, указав уникальный номер детали для каждой машины в таблице соединений для Products и Machines. Я пытаюсь найти таблицу Product вместе со всеми связанными данными, упомянутыми ниже. Однако у меня возникают проблемы с правильной индексацией всех связанных данных.

class Brand < ApplicationRecord
    has_many :machines
end 

class Machine < ApplicationRecord
    belongs_to :brand
    has_many :product_machines, dependent: :destroy
    has_many :products, through: :product_machines
end

class ProductMachines < ApplicationRecord
    belongs_to :machine
    belongs_to :product
end

class Product < ApplicationRecord
    has_many :product_machines, dependent: :destroy
    has_many :machines, through: :product_machines

    searchable do
        text :name
        text :machines do
            machine.name
            #how would I index the brand name (parent of machine)
            #how would I also index the part number field that is on the ProductMachines table?
        end
    end
end

Я понимаю, что мне нужно либо реализовать соединение, либо добавить несколько текстовых полей для индексов, как показано ниже:

searchable do
    text :name
    text :machines do
         machines.name
    end
    text :product_machines do
         product_machines.map(&:part_number)
    end
    text :brands do
        brands.map(&:name) 
    end

end

Однако, используя эту реализацию, я понял, что если бы я отфильтровал марку с помощью чего-то вроде with(:brand, "my brand"), то фильтр не исключил бы имена машин, которые явно связаны с ДРУГОЙ маркой. Однако я не знаю, как это подтвердить. Вот где мне нужна помощь. Я бы реализовал и протестировал соединение для всех своих моделей, но я могу найти документацию только для соединения двух напрямую связанных моделей; не модели с отношением has_many :through.

Заранее спасибо.


person Cannon Moyer    schedule 18.04.2019    source источник


Ответы (1)


Некоторое время назад я работал с Solr, используя драгоценный камень Sunspot. Насколько я помню, есть вариант multiple. Таким образом, вы можете попробовать проиндексировать свои данные как такой массив:

searchable do
  string(:brands, multiple: true) { brands.map(&:name }
end

а затем ищите как with(brands, ['foo', 'bar'])

PS взгляните на ElasticSearch

person user3309314    schedule 18.04.2019