Ruby on rails Rails 3使用JQuery自动完成-需要清理我的控制器代码

Ruby on rails Rails 3使用JQuery自动完成-需要清理我的控制器代码,ruby-on-rails,ruby-on-rails-3,autocomplete,Ruby On Rails,Ruby On Rails 3,Autocomplete,我的“自动完成”功能正常,看起来还不错,但天哪,控制器乱七八糟。自动完成在多个模型之间的搜索,这并没有帮助的事情,并合计找到的集合等-有国旗的客户等 我希望将其提取为部分或其他方式,以使代码更易于处理 def autocomplete customer_count = (Customer.select("company").where("LOWER(company) LIKE ? AND deleted != ?", "#{params[:term].downcase}%", t

我的“自动完成”功能正常,看起来还不错,但天哪,控制器乱七八糟。自动完成在多个模型之间的搜索,这并没有帮助的事情,并合计找到的集合等-有国旗的客户等

我希望将其提取为部分或其他方式,以使代码更易于处理

  def autocomplete
      customer_count = (Customer.select("company").where("LOWER(company) LIKE ? AND deleted != ?", "#{params[:term].downcase}%", true).count) + (Product.select("model_number,description").where("LOWER(description) LIKE ? OR LOWER(model_number) LIKE ? AND deleted != ?", "#{params[:term].downcase}%", "#{params[:term].downcase}%", true).count) + (Order.where("LOWER(order_number) LIKE ? AND deleted != true","#{params[:term].downcase}%").count)
      @customers = [{:label => (customer_count > 1 ? "<div style='font-weight: bold; text-align: left;'>Show all #{customer_count} records</div" : customer_count > 0 ? '' : "<div style='font-weight: bold; text-align: left;'>No records found</div>"), :link => "/customers?company=#{params[:term].downcase}"}]
      @customers.concat(Customer.select("id, company, country").where("LOWER(company) LIKE ? AND deleted != ?", "#{params[:term].downcase}%", true).limit(24).collect{|customer|{:label=>("<div style='float:left;margin-top:4px;margin-right:8px;'><img alt='Mini_usa' src='/images/#{customer.country_div}'/></div> #{customer.company}").html_safe,:link =>"/customers/#{customer.id}"}})
      @customers.concat(Product.select("id, model_number, description").where("LOWER(description) LIKE ? OR LOWER(model_number) LIKE ? AND deleted != ?","#{params[:term].downcase}%","#{params[:term].downcase}%",true).limit(24).collect{|product|{:label => ("#{product.model_number.titlecase}&nbsp;#{product.description.titlecase}").html_safe,:link =>"/products/#{product.model_number}"}})
      @customers.concat(Order.select("id, order_number").where("LOWER(order_number) LIKE ? AND deleted != true","#{params[:term].downcase}%").limit(24).collect{ |order| { :label => ("#{order.order_number}").html_safe, :link =>"/orders/#{order.id}" } })
  end
为什么不使用autocomplete或者search作为每个模型的上下文方法的更好名称,然后从控制器中调用并组合它们?这使我们有责任知道如何搜索数据本身在模型中的位置


一般来说,您希望将逻辑放在模型中,而不是控制器中。

所以您是说每个模型都需要自己的self.searchterm方法,术语由处理表单的ActionController传入,可能是productsindex…?@james_dunn_jr Yup!控制器从用户那里获取参数,然后要求模型搜索与之匹配的记录,因为控制器不应该知道如何搜索,只知道如何询问搜索结果。那么,这是否回答了您的问题?别忘了:@fatfrog将它们放在它们所属的视图中:根据Railscast教程,服务器端搜索是在控制器中完成的,我不知道如何找到它: