如何显示Rails SOLR多模式搜索的结果?

时间:2014-04-03 18:45:11

标签: ruby-on-rails ruby solr

在我的rails控制器中,我写了

@all = Sunspot.search(Car, Article, Organization) do 
      fulltext params[:search]
    end
    @all_res = @all.results

然后我有这些数据:

[#<Car id: 25, vehicle_manufacturer_id: 2, vehicle_model_id: 2, price: 0, year: 1900, eng_capacity: 1, fuel_type_id: 2, gearbox_id: 2, wheeldrive_id: 2, is_not_rus: false, color_id: 3, vehicle_registration_id: 2, condition_id: 1, body_type_id: 3, is_exchangeable: false, is_not_sell: nil, is_right_wheel: false, is_without_run_in_russia: false, is_gt: false, is_new: false, is_hybrid: nil, has_ac: false, has_leather: false, has_alloy_wheels: false, has_el_packet: false, has_signalization: false, user_id: 3, description: "Кароче типо крутая тачка", created_at: "2014-03-18 18:20:51", updated_at: "2014-03-18 20:29:32", vehicle_mileage: 0, contact_name: "df sdf ", city_id: 3, telephone: "123123", is_vip: nil>, #<Article id: 6, meta_description: "dfsdf", meta_keywords: "dssd", title: "sdffsdf", tags: "1", intro_text: "sdfsdf", content: "sfsdf sdf sdf ds \r\nкрутая", author_id: 1, articles_type_id: nil, published: true, publishing_start: "2014-02-25 18:02:00", publishing_end: "2014-02-25 18:02:00", is_advert: true, created_at: "2014-02-25 18:03:07", updated_at: "2014-02-25 18:03:07", article_image_file_name: nil, article_image_content_type: nil, article_image_file_size: nil, article_image_updated_at: nil, rostov: nil, krasnodar: nil, stavropol: nil>]

但我怎么能显示这个呢?

例如,如果是汽车,那么查看一些字段,如果文章比其他字段在视图中搜索结果?也许是真的可以展示 - 这个词的位置是什么?

4 个答案:

答案 0 :(得分:3)

试试这个,它可能适合你的情况

@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

答案 1 :(得分:0)

由于您在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

答案 2 :(得分:0)

使用Rails'partial rendering(具体来说,rendering collections)你可以在你的视图中尝试这样的事情:

<%= render @all.results %>

默认情况下,它会根据集合中每条记录的类查找partial。您的结果数组包含CarArticle个对象,因此render方法会查找cars/_cararticles/_article部分。

如果您想创建仅针对搜索结果的视图(例如,cars/_cars partial将在别处用于其他目的),您可以在与您的搜索控制器对应的视图目录中创建其他部分

假设您的控制器为SearchResultsController,相应的视图目录为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部分,并将Car记录分配给可在部分中使用的car变量:

# /app/views/search_results/_car.html.erb
<%= content_tag_for(:article, car) do %>
  <%= debug car %>
<% end %>  

答案 3 :(得分:0)

我们还可以使用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 %>

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