объединить несколько результатов поиска - PullRequest
0 голосов
/ 21 мая 2018

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

неопределенный метод `username 'для #Tag: 0x0000

, так как я нахожу много решенийприходят с конкатенацией запроса и модели связаны.

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

модель:

class Search < ApplicationRecord
    extend Textacular

  belongs_to :searchable, polymorphic: true
   attr_accessor :query


  def results
    if @query.present?
      self.class.search(@query).preload(:searchable).to_a.map!(&:searchable).uniq
    else
      Search.none
    end
  end

end

контроллер:

class SearchController < ApplicationController
respond_to :html


def index
  @users = User.search(params[:search])
  @tags = Tag.search(params[:search])
  @search_results = @users + @tags  

 if params[:search].present?
        @search_results = Search.new(query: params[:search]).results
    else
        @users = User.all
    end

  end

end

вид:

<div>
<% @search_results.each do |r| %>

<%= r.username %>
<%= r.name %>

<% end %> 

</div>

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

В вашем действии контроллера вы сначала присваиваете значения @users и @search_results, а затем просто переопределяете одно из них , не используя it.Итак, я немного переместил операторы, чтобы удалить любое неиспользуемое присвоение значений:

class SearchController < ApplicationController
  def index
    if params[:search].present?
      @search_results = Search.new(query: params[:search]).results
    else
      @users = User.all
    end

    # Are you sure you still need to set `@users` and `@tags`? Reason: `@search_results` above would already be set if `params[:search]` was present.
    @users ||= User.search(params[:search])    # Assigns only if @users is not previously set
    @tags = Tag.search(params[:search])
    @search_results ||= @users + @tags
  end
end

Дальнейшее улучшение может быть достигнуто, если вы используете только @search_results в своем представлении и NOT @users и @tags:

class SearchController < ApplicationController
  def index
    @search_results = if params[:search].present?
                        Search.new(query: params[:search]).results
                      else
                        User.all + Tag.all
                      end
  end
end

И, наконец, на ваш взгляд:

<div>
  <% @search_results.each do |r| %>
    <% if r.respond_to?(:name) %>
      <%= r.name %>
    <% elsif r.respond_to?(:username) %>
      <%= r.username %>
    <% end %>
  <% end %> 
</div>
0 голосов
/ 21 мая 2018

В контроллере у вас есть

@users = User.search(params[:search])
@tags = Tag.search(params[:search])
@search_results = @users + @tags  

Итак, @users являются членами User класса, а @tags являются членами Tag класса.

Вы звоните *Атрибут 1010 * для @search_results, так что вы делаете это для @tags.

Простое решение - использовать два каждого цикла в поле зрения, один для @users и один для @tags.

<% @users.each do |user| %>
<%= user.username %>
<% end %>

И

<% @tags.each do |tag| %>
<%= tag.name %>
<% end %>

Еще одно исправление, которое, по моему мнению, должно работать, заключается в добавлении псевдонима атрибута Tag или User, например здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...