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)
Refactorings
No refactoring yet !
Adam
October 29, 2010, October 29, 2010 19:23, permalink
class Package < ActiveRecord::Base
scope :delivered_after_scheduled, where('actual_delivery IS NOT NULL AND actual_delivery > scheduled_delivery')
scope :carrier, lambda { |carrier| where(:carrier_id => carrier.id) }
scope :status, lambda { |status| where(:status_id => status.id) }
end
class PackagesController < ApplicationController
def index
scope = Package
scope = scope.carrier(carrier) if carrier
scope = scope.status(status) if status
@packages = scope.delivered_after_scheduled
end
end
Case Nelson
November 6, 2010, November 06, 2010 16:29, permalink
I'm new to rails and I found the scope variable in the controller confusing as it clashes with the method name on the model. It looks like this is why .scoped exists
class Package < ActiveRecord::Base
scope :delivered_after_scheduled, where('actual_delivery IS NOT NULL AND actual_delivery > scheduled_delivery')
scope :carrier, lambda { |carrier| where(:carrier_id => carrier.id) }
scope :status, lambda { |status| where(:status_id => status.id) }
end
class PackagesController < ApplicationController
def index
packages = Package.scoped
packages = packages.carrier(carrier) if carrier
packages = packages.status(status) if status
@packages = packages.delivered_after_scheduled
end
end
Need some help refactoring this if/else block that builds the conditions for a find query.