如何显示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。 您的结果数组包含CarArticle对象,因此render方法将查找cars/_cararticles/_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 %> 

知道我迟到但这可能会有所帮助:)