【问题标题】:How can I display results for a Rails SOLR multimodal search?如何显示 Rails SOLR 多模式搜索的结果?
【发布时间】:2014-04-03 18:45:11
【问题描述】:

在我的 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>]

但是我怎么能漂亮地展示这个呢?

例如,如果是汽车,则查看某个字段,如果文章而不是查看搜索结果中的其他字段?也可能是真实的显示 - 这个词是在哪里找到的?

【问题讨论】:

    标签: ruby-on-rails ruby solr


    【解决方案1】:

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

    @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
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 不,这是不好的方式,我不需要这个!我需要一次全部...并显示它并订购整个搜索...
      • 您要按哪些字段排序?您想在视图中显示哪些字段?
      • 模型 1 的 field1 field2 和其他的 field1 field2,按 created_at 排序
      • 请具体说明,这两个模型中的字段是否同名?如果要将所有数据显示到表格中,列标题名称是什么?
      • 是的,有些字段是相同的名称,有些不是,标题名称将是标题和一些不同的名称模型字段
      【解决方案3】:

      使用 Rails 的 partial rendering(特别是 rendering collections),您可以在视图中尝试这样的操作:

      <%= render @all.results %>
      

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

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

      假设你的控制器是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 会将该对象分配给与部分名称匹配的局部变量。例如,您的第一个结果是 Car 对象。此代码将查找 search_results/_car 部分并将该 Car 记录分配给可在部分中使用的 car 变量:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2011-05-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-11-03
          • 2021-12-10
          • 1970-01-01
          相关资源
          最近更新 更多