2016-01-21 2 views
0

Я пытаюсь реализовать полнотекстовый поиск в моем приложении rails. Я использую PostgreSQL как базу данных, поэтому, используя возможности полнотекстового поиска PostgreSQL. У меня есть две модели пользователей и табло, и я хочу выполнить поиск по обоим моделям по отдельным столбцам, чтобы вытащить записи.Поиск нескольких моделей с pg_search

Я использую pg_search gem для полнотекстового поиска, я прочитал многозадачную документацию и успешно реализовал все. Я создал таблицу pg_search_documents. Код приведен ниже.

табло Модель

include PgSearch 
    multisearchable :against => [:name_of_organization, :name_of_activity, :name_of_scoreboard] 

пользователя Модель

include PgSearch 
    multisearchable :against => :name 

Controller Код

def index 
    @pg_search_documents = PgSearch.multisearch(params[:search]) 
end 

себе arch работает, когда я запускаю код <%= pg_search.searchable %> в представлении. Это возвращает как пользовательские, так и табло, когда каждый из них выполняется поиск.

Посмотреть код

<% @pg_search_documents.each do |pg_search| %> 
     <%= pg_search.searchable.name %> 
     <%= pg_search.searchable.name_of_organization %> 
<% end %> 

Однако, когда я пытаюсь запустить код вида приведенный выше и поиск имени, я получаю следующее сообщение об ошибке,

undefined method `name_of_scoreboard' for #<User:0x007fa44ad18cd8>. 

я получаю аналогичная ошибка, когда я пытаюсь найти имя_of_scoreboard,

`undefined method `name' for #<Scoreboard:0x00000006fa3560>.` 

Если я использую следующий код, на мой взгляд, <%= @pg_search_documents.searchable.id %>, отображаются идентификаторы для пользователя и табло. Это означает, что я могу искать только те столбцы, которые являются общими в обеих моделях.

Если я попытаюсь выполнить поиск двух разных столбцов, таких как имя и имя_о_оценки, я получаю две ошибки, упомянутые выше. Я могу искать между двумя разными моделями, но я не могу отображать результаты из представления. Я не уверен, что я делаю что-то неправильно или, может быть, у меня что-то важное. Я действительно не уверен. Я попытался держать его в курсе и попытался включить соответствующую информацию. Если какой-либо конкретный код требуется, сообщите мне. Как всегда, любая помощь очень ценится !!

ответ

2

Я думаю, что вы смешиваете «поиск» и отображаете столбец из результатов. Похоже, ваш код действительно ищет разные поля в нескольких моделях. Затем этот поиск возвращает массив «документов», которые указывают на соответствующие объекты. Проблема заключается в том, что вы пытаетесь отобразить имя объекта, у которого нет имени. Я думаю, что что-то вроде следующего - это то, что вы собираетесь делать.

<% @pg_search_documents.each do |pg_search| %> 
    <% if pg_search.searchable.respond_to?(:name) %> 
    <%= pg_search.searchable.name %> 
    <% else %> 
    <%= pg_search.searchable.name_of_organization %> 
    <% end %> 
<% end %> 

Это будет отображаться имя, если объект результата имеет имя (то есть - если его пользователь) и в противном случае название организации (если его табло). Обратите внимание, что это не очень хорошее решение, так как теперь вы вводите логику в свое мнение, но это объясняет проблему.

+0

@ Tom Walpole Большое вам спасибо, это определенно работает.Я понимаю утверждение if и else. Однако не возражаете ли вы объяснить код <% if pg_search.searchable.respond_to? (: Name)%>. Хотя, я могу понять код, прочитав его. Я не совсем понимаю это. Кроме того, что было бы лучшим местом для логики, связанной с представлением. Обычно я указываю выражения if и else в представлении. – kpaul

+0

Этот код просто видит, имеет ли объект метод «имя», поскольку объект табло не соответствует только пользователям. Это немного более гибко, чем сказать «if pg_search.searchable.is_a? User', так как если бы вы добавили другие объекты в результаты с помощью метода имени, он бы просто продолжал работать (см. Утиную печать). Для удаления логики из представлений, прочитанных на шаблоне декоратора, или вы можете просто отобразить частичное для каждого из результатов, что скроет логику в частичном рендеринге, поскольку оно будет использовать другое частичное для каждого типа объекта результата - render @ pg_search_documents.to_a –

+0

@ Tom Walpole Большое вам спасибо за такой подробный ответ. Я очень ценю помощь. Еще раз спасибо!! – kpaul

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