代码之家  ›  专栏  ›  技术社区  ›  Shpigford

重构:find查询中有多个参数

  •  1
  • Shpigford  · 技术社区  · 14 年前

    需要一些帮助来重构这个if/else块,该块为find查询构建条件。

    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 回复  |  直到 14 年前
        1
  •  0
  •   jordinl    14 年前

    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])
    
        2
  •  1
  •   Jaime Bellmyer    14 年前

    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
    

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