# controller
class ArticoliController < ApplicationController
before_filter :find_scope, :only => [ :index, :new, :create ]
def index
if params[:bolla_da_fornitore_id]
@articoli = @carico.articoli.search(:term => params[:q], :page => params[:page])
render 'carichi/articoli'
elsif params[:bolla_verso_redazione_id]
@articoli = @uscita.articoli.search(:term => params[:q], :page => params[:page])
render 'uscite/articoli'
elsif params[:bolla_verso_fornitore_id]
@articoli = @reso.articoli.search(:term => params[:q], :page => params[:page])
render 'resi/articoli'
elsif params[:bolla_da_redazione_id]
@articoli = @rientro.articoli.search(:term => params[:q], :page => params[:page])
render 'rientri/articoli'
else
@articoli_grid = initialize_grid(Articolo, :include => :fornitore, :joins => [:linea, :stagione], :name => 'articoli_grid')
end
end
private
def find_scope
@carico = BollaDaFornitore.find(params[:bolla_da_fornitore_id]) if params[:bolla_da_fornitore_id]
@rientro = BollaDaRedazione.find(params[:bolla_da_redazione_id]) if params[:bolla_da_redazione_id]
@uscita = BollaVersoRedazione.find(params[:bolla_verso_redazione_id]) if params[:bolla_verso_redazione_id]
@reso = BollaVersoFornitore.find(params[:bolla_verso_fornitore_id]) if params[:bolla_verso_fornitore_id]
end
# module
module Searchable
def self.included(base)
base.class_eval do
extend ClassMethods
cattr_accessor :searchable_attrs
end
end
module ClassMethods
def search(*args)
options = args.extract_options!
options[:per_page] ||= 10
options[:page] ||= 1
options[:order] ||= 'id ASC'
term = options.delete(:term).to_s
if term.present?
options.merge!({:conditions => [self.searchable_attrs.collect { |c| c + " LIKE :term" }.join(" OR ") , { :term => '%' + term + '%' }]})
end
paginate(options)
end
end
end
# model
class Articolo < ActiveRecord::Base
include Searchable
self.searchable_attrs = %w(codice descrizione ean_13).freeze
Refactorings
No refactoring yet !
Adam
October 17, 2009, October 17, 2009 13:20, permalink
class ArticoliController < ApplicationController
AVAILABLE_SCOPES = [ BollaDaFornitore, BollaDaRedazione, BollaVersoRedazione, BollaVersoFornitore ]
def index
@articoli = scope.articoli.search(:term => params[:q], :page => params[:page])
end
private
def scope
AVAILABLE_SCOPES.inject(nil) do |klass|
break klass if params["#{klass.to_s.underscore}_id"]
end || Articoli
end
end
Colin Curtin
October 19, 2009, October 19, 2009 19:19, permalink
A refactoring of Adam's refactoring
def scope
AVAILABLE_SCOPES.find{|klass| params["#{klass.to_s.underscore}_id"]} || Articoli
end
this is a little piece of code that can display different stuff based on where we are coming from, it's a shallow route. better ways?