【问题标题】:Gathering search results from a multi-model query从多模型查询中收集搜索结果
【发布时间】:2016-05-30 18:58:35
【问题描述】:

我目前正在使用 searchkick gem 索引搜索查询。还应该注意的是,我正在搜索两个模型,ArtistsAlbums。在我的 search_controller 中,我有 3 个实例变量,第一个是 @results,用于为我的 autocomplete(在其他地方使用)返回两个模型中的所有结果:

@results = Artist.search(params[:query], index_name: [Artist.searchkick_index.name, Album.searchkick_index.name], fields: [{ name: :word_start }], limit: 10)

然后是我的@artists/@albums 实例变量。

@artists = @results.select { |result| result.class.name == "Artist" }
@albums = @results.select { |result| result.class.name == "Album" }

我将这些结果拆分,以便在我的索引视图中对艺术家和专辑进行分组:

<h1>Search Results</h1>

<div class="artist-results">
  <h2>Artists</h2>

  <% @artists.each do |artist| %>
    <%= link_to artist.name, artist_path(artist) %>
  <% end %>
</div>

<div class="album-results">
  <h2>Albums</h2>

  <% @albums.each do |album| %>
    <%= link_to album.name, album_path(album) %>
  <% end %>
</div>

我对搜索控制器代码的一个主要担忧是我正在执行 2 个几乎相同的枚举。我可能是错的,但有些事情告诉我我不应该这样做。我正在做的事情有更高效的解决方案吗?我在正确的轨道上吗?

完整的控制器代码

class SearchController < ApplicationController
  before_filter :set_results

  def index
  end

  def autocomplete
    render json: @results
  end

  private
    def set_results
      @results = Artist.search(params[:query], index_name: [Artist.searchkick_index.name, Album.searchkick_index.name], fields: [{ name: :word_start }], limit: 10)
      @artists = @results.select { |result| result.class.name == "Artist" }
      @albums = @results.select { |result| result.class.name == "Album" }
    end
end

【问题讨论】:

    标签: ruby-on-rails search elasticsearch controller enumerable


    【解决方案1】:

    不确定它是否更高效。但你可以使用group by

    results = Artist.search(params[:query], index_name: [Artist.searchkick_index.name, Album.searchkick_index.name], fields: [{ name: :word_start }], limit: 10)
    @grouped_results = results.group_by{|x| x.class.name }
    

    然后

    <h1>Search Results</h1>
    
    <% @grouped_results.each do |class_name, results| %>
      <div class="<%= class_name.downcase %>-results">
        <h2><%= class_name.pluralize %></h2>
    
        <% results.each do |result| %>
          <%= link_to result %>
        <% end %>    
      </div>
    <% end %>
    

    【讨论】:

    • 谢谢。我认为您在类声明的末尾缺少双引号。
    • 没问题。在我这边发现了一个错误。忘记将第一个参数添加到我的link_to 中。所以基本上&lt;%= link_to result %&gt; 应该读作&lt;%= link_to result.name, result %&gt;。没有在我原来的问题中完整地写出来,这是我的坏事。
    • 虽然在这个话题上有一个问题。 Rails 如何知道如何正确链接到正确的页面,而不需要像 artist_path(artist) 这样的指定帮助器或手写它:{ controller: artist, id: artist }
    • 魔术......它做出假设。它将转到url_for,这将归结为并且基本上假设您已经按照我的理解遵循了rails的约定。所以艺术家将在artist_path(artist)
    • 很神奇。谢谢。如果我可以再问一个问题。假设这张专辑有一个名为 title 而不是 name 的属性(在这里扮演魔鬼的拥护者)。您是否必须编写某种条件来检查每个块中的class_name 以正确显示正确的文本?另外,+1 为您提供额外帮助。
    猜你喜欢
    • 1970-01-01
    • 2013-01-30
    • 2019-03-01
    • 2011-03-22
    • 1970-01-01
    • 2014-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多