Рефакторинг: несколько параметров в поисковом запросе - PullRequest
1 голос
/ 29 октября 2010

Нужна помощь в рефакторинге этого блока if / else, который создает условия для запроса поиска.

if params[:status] && params[:carrier]
  conditions = ["actual_delivery IS NOT NULL AND actual_delivery > scheduled_delivery AND status_id = ? AND carrier_id = ?", status.id, carrier.id]
elsif params[:status]
  conditions = ["actual_delivery IS NOT NULL AND actual_delivery > scheduled_delivery AND status_id = ?", status.id]
elsif params[:carrier]
  conditions = ["actual_delivery IS NOT NULL AND actual_delivery > scheduled_delivery AND carrier_id = ?", carrier.id]
else
  conditions = ["actual_delivery IS NOT NULL AND actual_delivery > scheduled_delivery"]
end

@packages = Package.find(:all, :conditions => conditions)

Ответы [ 2 ]

1 голос
/ 29 октября 2010

Я рекомендую создать область в вашей модели, чтобы позаботиться о первой части вашего запроса, которая всегда одинакова в этом действии:

class Package < ActiveRecord::Base
  named_scope :late_deliveries, :conditions => "actual_delivery IS NOT NULL AND actual_delivery > scheduled_delivery"
end

Теперь вы можете реорганизовать свои действия следующим образом:

def index
  conditions = {}
  [:status, :carrer].each{|param| conditions[param] = params[param] if params[param]}

  @packages = Package.late_deliveries.find(:conditions => conditions)
end

Если: carrier и: status являются единственными двумя параметрами этого действия, то это еще проще:

def index
  @packages = Package.late_deliveries.find(:conditions => params)
end

Надеюсь, это поможет!

0 голосов
/ 29 октября 2010

Вы можете сделать:

conditions = "actual_delivery IS NOT NULL AND actual_delivery > scheduled_delivery"
conditions += " AND status_id = #{status.id}" if params[:status]
conditions += " AND carrier_id = #{carrier.id}" if params[:carrier]

@packages = Package.all(:conditions => [conditions])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...