Rails 3 автозаполнение с JQuery - необходимо очистить код моего контроллера - PullRequest
0 голосов
/ 08 марта 2012

Мой автозаполнение работает, и выглядит достаточно прилично, но, боже, контроллер в беспорядке. Автозаполнение выполняет поиск по нескольким моделям, что не помогает, и суммирует найденные наборы - существуют флаги стран для клиентов и т. Д.

Я бы хотел в идеале извлечь это из частичного или каким-либо другим способом, чтобы облегчить работу с кодом.

  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

1 Ответ

2 голосов
/ 08 марта 2012

Почему бы вам не сделать autocomplete (или, возможно, search - это лучшее название для контекста) методов для каждой отдельной модели, а затем вызвать и объединить их каждый из вашего контроллера? Это сохраняет ответственность за знание как искать, где находятся сами данные (в модели).

Как правило, вы предпочитаете использовать логику в вашей модели, а не в контроллере.

...