Я пытаюсь реализовать полнотекстовый поиск в моем приложении 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 %>
, отображаются идентификаторы для пользователя и табло. Это означает, что я могу искать только те столбцы, которые являются общими в обеих моделях.
Если я попытаюсь выполнить поиск двух разных столбцов, таких как имя и имя_о_оценки, я получаю две ошибки, упомянутые выше. Я могу искать между двумя разными моделями, но я не могу отображать результаты из представления. Я не уверен, что я делаю что-то неправильно или, может быть, у меня что-то важное. Я действительно не уверен. Я попытался держать его в курсе и попытался включить соответствующую информацию. Если какой-либо конкретный код требуется, сообщите мне. Как всегда, любая помощь очень ценится !!
@ Tom Walpole Большое вам спасибо, это определенно работает.Я понимаю утверждение if и else. Однако не возражаете ли вы объяснить код <% if pg_search.searchable.respond_to? (: Name)%>. Хотя, я могу понять код, прочитав его. Я не совсем понимаю это. Кроме того, что было бы лучшим местом для логики, связанной с представлением. Обычно я указываю выражения if и else в представлении. – kpaul
Этот код просто видит, имеет ли объект метод «имя», поскольку объект табло не соответствует только пользователям. Это немного более гибко, чем сказать «if pg_search.searchable.is_a? User', так как если бы вы добавили другие объекты в результаты с помощью метода имени, он бы просто продолжал работать (см. Утиную печать). Для удаления логики из представлений, прочитанных на шаблоне декоратора, или вы можете просто отобразить частичное для каждого из результатов, что скроет логику в частичном рендеринге, поскольку оно будет использовать другое частичное для каждого типа объекта результата - render @ pg_search_documents.to_a –
@ Tom Walpole Большое вам спасибо за такой подробный ответ. Я очень ценю помощь. Еще раз спасибо!! – kpaul