如何创建搜索function – Ruby On Rails

我试图为应用程序创建搜索function。 我有一个名为搜索的服务对象,所有搜索逻辑都在此对象中。

当搜索表单与about查询一起提交时,Search Controller中的@results是以下数组。

 => [ [0] [], [1] [ [0] About { :id => 2, :title => "About", :slug => "about", :meta_description => "", :meta_keywords => "", :content => "

Lorem ipsum about

", :position => 1, :published => true, :on_menu => true, :created_at => Wed, 13 Jan 2016 00:44:08 UTC +00:00, :updated_at => Fri, 15 Jan 2016 04:05:52 UTC +00:00 } ], [2] [], [3] [] ]

这是我的搜索对象。 查看用户属性与Pages和NewsArticle的不同之处? 好。 现在去看看。

 class SearchService attr_accessor :query def initialize(query) @query = query end # searchable_fields_by_model CONDITIONS_BY_MODEL = { Page => [:title, :content], NewsArticle => [:title, :content] User => [:first_name, :last_name] } def raw_results ActiveRecord::Base.transaction do CONDITIONS_BY_MODEL.flat_map do |model, fields| Array(fields).map do |field| model.where(["#{field} LIKE ?", "%#{query}%"]) end end end end end 

以下是我的看法。 目前,视图仅显示contenttitle 。 但我的用户有first_namelast_name因此它不会显示。 我需要一种方法来显示所有模型的结果,它需要是干净的,所以如果我添加另一个模型来搜索完全不同的属性,它仍然会显示。 你会怎么做?

 .page-header %h1 Search#index - @results.each do |results| - results.each do |r| %p= r.title %p= r.content 

搜索控制器

 class SearchController < ApplicationController def index @results = SearchService.new(params[:q]).results end end 

如何解决这个问题。

 class SearchController < ApplicationController def index @results = SearchService.new(params[:q]).results @page_results = [] @news_article_results = [] @category_results = [] @results.each do |resource| if resource.class == Page @page_results << resource elsif resource.class == NewsArticle @news_article_results << resource elsif resource.class == Category @category_results << resource else end end end end class SearchService MIN_QUERY_LENGTH = 3 attr_accessor :query def initialize(query) raise ArgumentError if query.length < MIN_QUERY_LENGTH @query = query end # searchable_fields_by_model CONDITIONS_BY_MODEL = { Page => [:title, :content], NewsArticle => [:title, :content], Category => :name, } def results @results ||= ActiveRecord::Base.transaction do CONDITIONS_BY_MODEL.flat_map do |model, fields| Array(fields).flat_map do |field| model.where(["#{field} LIKE ?", "%#{query}%"]) end end end end end 

这是我的看法

 .page-header %h1 Search Results %h2= "For #{params[:q]}" %br %h2 Pages - @page_results.each do |resource| %p= link_to "#{resource.title}", page_path(resource.slug) = resource.content.html_safe %h2 News Article - @news_article_results.each do |resource| %p= link_to "#{resource.title}", news_article_path(resource.slug) = resource.content.html_safe %h2 Category - @category_results.each do |resource| %p= link_to "#{resource.name}", category_path(resource.slug)