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

у меня 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: через отношения.

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

1 Ответ

0 голосов
/ 18 апреля 2019

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

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

, а затем выполнить поиск как with(brands, ['foo', 'bar'])

PS. Посмотрите на ElasticSearch

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