2015-06-25 5 views
2

Im пытается использовать Searchkick для запуска поиска и возврата на основе нескольких моделей.Rails Searchkick/Elasticsearch has_many и принадлежит ассоциациям

Моя книга модель содержит этот

class Book < ActiveRecord::Base 

    searchkick 

    has_many :book_subjects 
    has_many :subjects, through: :book_subjects 

    belongs_to :author 
    belongs_to :publisher 

end 

, а затем мой контроллер имеет этот

def index 

if params[:search].present? 
    @books = Book.search(params[:search], operator: "or") 
else 
    @books = Book.all 
end 
end 

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

благодаря

ответ

12

В вашей модели книги вам нужно иметь search_data блок для индексации.

def search_data 
    attributes.merge(
    author_name: author(&:name) 
    publisher_name: publisher(&:name) 
    subjects_name: subjects.map(&:name) 
) 
end 

это добавит ассоциации к вашему индексу.

Вы используете метод .map для ассоциаций has_many.

+0

Спасибо, это был хороший момент в правильном направлении. subject_name не работает, но понял это. – railsey

+0

делает это обновление search_data, когда, например, тема была отредактирована? –

+0

есть небольшая ошибка с 'subject_name'. Правильный способ сделать это с помощью ассоциации has_many: 'subject_name: subjects.map (&: name)' –

Смежные вопросы