如何显示Rails SOLR多模式搜索的结果?
在我的rails控制器中我写
@all = Sunspot.search(Car, Article, Organization) do fulltext params[:search] end @all_res = @all.results
然后我有这些数据:
[#, #]
但我怎么能显示这个呢?
例如,如果是汽车,那么查看一些字段,如果文章比其他字段在视图中搜索结果? 也许它是真实的展示 – 这个词在哪里找到?
试试这个,它可能适合你的情况
@all.results.each do |result| case result.class.name when 'Car' <%= result.vehicle_manufacturer_id %> <%= result.vehicle_model_id %> when 'Article' <%= result.meta_description %> <%= result.meta_keywords %> end end
由于您在Car和Article模型之间没有任何共同的主要字段,因此您应该将搜索分开。 这样,它允许您稍后添加更多条件以轻松缩小结果范围。
假设您想要搜索汽车和文章,以便于解释。
您可以拥有一个搜索汽车的页面,以及另一个搜索文章的页面。 或者,如果您愿意,让一个页面包含一个搜索框,并让控制器的操作调用两个单独的搜索方法。 然后,您将在两个实例变量中存储两个搜索结果。 在视图中,您可以有两个结果部分,一个用于汽车,一个用于文章,分别循环遍历每个实例变量。
搜索者将是这样的:
#app/models/searcher.rb class Searcher def self.search_cars(term) Car.search do fulltext term end end def self.search_articles(term) Article.search do fulltext term end end end
使用Rails的部分渲染 (特别是渲染集合 ),您可以在视图中尝试这样的事情:
<%= render @all.results %>
默认情况下,它将根据集合中每条记录的类查找partial。 您的结果数组包含Car
和Article
对象,因此render
方法将查找cars/_car
和articles/_article
cars/_car
partial。
如果要创建仅针对搜索结果的视图(例如, cars/_cars
partial将在其他地方用于其他目的),则可以在与搜索控制器对应的视图目录中创建其他部分。
假设你的控制器是SearchResultsController
,相应的views目录是search_results
。 您可以在/app/views/search_results/
创建以下部分:
_car.html.erb _article.html.erb _organization.html.erb
然后,在要显示结果的视图中,您可以执行以下操作:
<% @all.results.each do |result| %> <%= render partial: "search_results/#{result.class.to_s.underscore}", object: result %> <% end %>
使用object
选项,Rails会将该对象分配给与partial的名称匹配的局部变量。 例如,您的第一个结果是Car
对象。 此代码将查找search_results/_car
partial并将该Car
记录分配给可在partial中使用的car
变量:
# /app/views/search_results/_car.html.erb <%= content_tag_for(:article, car) do %> <%= debug car %> <% end %>
我们也可以使用is_a?
检查model
并为每个模型渲染相应partial
的方法。
<%= @all_res.each do |result| %> <% if result.is_a?(Car) %> <%= render 'car', car: result %> <% elsif result.is_a?(Article) %> <%= render 'article', article: result %> <% elsif result.is_a?(Organization) %> <%= render 'organization', organization: result %> <% end %> <% end %>
知道我迟到但这可能会有所帮助:)