【发布时间】:2016-05-30 18:58:35
【问题描述】:
我目前正在使用 searchkick gem 索引搜索查询。还应该注意的是,我正在搜索两个模型,Artists 和 Albums。在我的 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