结合多个搜索结果

时间:2018-05-21 03:45:13

标签: ruby-on-rails ruby postgresql

首先,感谢您的帮助和支持。 在设置了一个简单的搜索使用风景和textacular。 我试图将结果与搜索控制器上的简单组合结合起来。 搜索效果很好但是,如果我搜索标签, 我得到了

  

#Tag的未定义方法`username':0x0000

因为我发现很多解决方案都是连接查询并且模型是关联的。

所以在这种情况下,模型没有关联。 所以有人可以提示如何在一个查询中组合分离的模型attrs?

模特:

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 :(得分:0)

在控制器中你有

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

因此,@usersUser类的成员,@tagsTag类的成员。

您正在username上调用@search_results属性,因此您是在@tags上进行的。

简单的解决方法是在视图中使用两个周期,一个用于@users,另一个用于@tags

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

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

我认为另一种解决方法应该是使用here等标记或用户的属性。

答案 1 :(得分:0)

在您的控制器操作中,您首先将值分配给@search_resultsclass 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

如果您在视图中仅使用@users @tagsclass 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>

最后在你看来:

/^  Stream #([\d:]+) -> #([\d:]+) \((.*)\)/gm