Поиск has_many ассоциации с Searchkick - PullRequest
0 голосов
/ 21 декабря 2018

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

В моей модели пользователя у меня есть:

class User < ApplicationRecord
    searchkick
    has_many :items, -> (user) { unscope(:where).where("(consumer_type = ? and consumer_id = ?))", 'User', user.id) }, fully_load: false, dependent: :destroy

    # not sure if this is helpful, was messing around with this
    def search_data
        {
            name: items.name
        }
    end
end

Тогда в моей модели элементов у меня есть:

class Item < ApplicationRecord
    belongs_to :consumable, polymorphic: true
    belongs_to :consumer, polymorphic: true
end

Тогда у меня есть еще две модели, "Книга" и "Камера", которые принадлежат Предмету.Мне нужно иметь возможность запускать запрос в моем контроллере, например:

@results = current_user.items.search('Query')

..., чтобы он возвращал результаты как Книги, так и камеры, которые соответствуют поисковому запросу.Я прочитал раздел Персонализированные результаты в документах Searchkick, но не смог заставить его работать вообще.Любые полезные советы, или кто-нибудь достиг результатов, подобных определенному для конкретного пользователя?

1 Ответ

0 голосов
/ 16 января 2019
@results = current_user.items.search('Query')

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

class Item
 searchkick word_middle: %i[name]
 def search_data
   {
     consumer_type: consumer.class.to_s
     consumer_id: consumer.id.to_s
     name: self.name
   }
 end
end

options = {where: [{consumer_type: 'User', consumer_id: current_user.id.to_s}]}
results = Item.search 'query', options
...