Rails 4 searchkick с отношениями «многие ко многим»

Как реализовать фильтр категорий для searchkick. По сути, у меня есть поле ввода, которое принимает термин запроса, но я также хочу раскрывающийся список, в котором пользователи могут выбирать категорию для поиска или искать во ВСЕХ категориях. Между записями и категориями существует связь «многие ко многим».

Мои модели:

-- post.rb
class Post < ActiveRecord::Base
 has_many :post_categories
 has_many :categories, through: :post_categories
 searchkick text_start: [:title]
end

-- category.rb
class Category < ActiveRecord::Base
    has_many :post_categories
    has_many :posts, through: :post_categories
end

--post_category.rb
class PostCategory < ActiveRecord::Base
    belongs_to :post
    belongs_to :category
end

Теперь в моем действии индекса posts_controller у меня есть следующее, которое работает до сих пор, возвращая все сообщения, соответствующие параметру запроса, или возвращает все сообщения, если во входных данных поиска не указан параметр запроса.

class PostsController < ApplicationController

    def index
        query = params[:q].presence || "*"
        @posts = Post.search (query)
    end
end

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


person Alex    schedule 08.06.2016    source источник
comment
Пробовали ли вы сами добавить фильтр категорий?   -  person Wes Foster    schedule 09.06.2016


Ответы (1)


Согласно документации по searchkick, вы можете добавить параметры в запрос .search — см. здесь раздел Запросы, в частности где. Образец из документов:

Product.search "apples", where: {in_stock: true}, limit: 10, offset: 50

Должно быть что-то похожее

Post.search query, where: {category: [some_array]}

Примечание. Драгоценный камень searchkick преобразует условия из оператора where в фильтры ElasticSearch (см. ">здесь)

Обновление — для поиска по атрибутам связанных объектов (не самой модели) необходимо включить ее поля в search_index — см. пример здесь

Добавьте заголовки категорий в метод search_data.

class Project < ActiveRecord::Base
  def search_data
    attributes.merge(
      categories_title: categories.map(&:title)
    )
  end
end

Также этот вопрос по связанной теме

По умолчанию search_data для searchkick является возвратом вызова модели serializable_hash - см. >источники для справки.

def search_data
  respond_to?(:to_hash) ? to_hash : serializable_hash
end unless method_defined?(:search_data)

Который по умолчанию не включает ничего из ассоциаций, если только он не передается с параметром :include - rel="nofollow noreferrer">источник

 def serializable_hash(options = nil)
    ...
    serializable_add_includes(options) do ..
 end

 def serializable_add_includes(options = {}) #:nodoc:
   return unless includes = options[:include]
 ...
 end
person Pavel Bulanov    schedule 08.06.2016
comment
Да, я уже пробовал этот метод, но ничего не дает. Я пробовал @posts = Post.search (query), where: {category: ["Wedding"]}, но по-прежнему не дает результатов. не уверен, что мне не хватает. - person Alex; 09.06.2016
comment
На всякий случай проверьте явную синтаксическую ошибку - вызовите Post.search(query, where: {..}) - все внутри ( ) - person Pavel Bulanov; 09.06.2016
comment
По общему правилу избегайте пробелов между именем метода и квадратными скобками — пишите call(params), а не call (params) — вы можете легко найти это, например. здесь - person Pavel Bulanov; 09.06.2016
comment
см. обновление - ассоциации не индексируются по умолчанию - person Pavel Bulanov; 09.06.2016
comment
Да, настройка search_data для связанных моделей сработала. Большое спасибо Павел. - person Alex; 09.06.2016