B04a553de1b8b45433b841bba440cc42

Hi, trying to implement one method that could search through model Company with fulltext, including categories (has_many through), localities and a date condition. Thanks for any advice ;)

def self.paged_search(query, custom_options = {})
    options = {:per_page => 10}
    options.update(custom_options)

    query_str = []
    query_prms = []

    if options[:from]
      query_str << "created_at > ?"
      query_prms << options[:from]
    end
    
    if options[:locality]
      query_str << "locality_id IN (?)"
      query_prms << options[:locality].is_a?(Array) ? options[:locality] : Locality.find_with_children(options[:locality])
    end

    if options[:category]
      query_str << "categories.id IN (?)"
      query_prms << options[:category].is_a?(Array) ? options[:category] : Category.find_with_children(options[:category])
    end

    conditions = [query_str.join(" AND ")] + query_prms
    search_options = {:conditions => conditions, :include => :categories, :page => options[:page], :per_page => options[:per_page]}

    query.blank? ? Company.paginate(search_options) : Company.search(query, search_options )
  end

Refactorings

No refactoring yet !

A8d3f35baafdaea851914b17dae9e1fc

Adam

September 25, 2009, September 25, 2009 16:09, permalink

No rating. Login to rate!
class Company < ActiveRecord::Base
  named_scope :created_after, lambda { |date| { :conditions => [ 'created_at > ?', date ] } if date }
  named_scope :in_locality, lambda { |location| { :conditions => [ 'locality_id IN (?)', location.is_a?(Array) ? location : Locality.find_with_children(location) ] } }
  named_scope :with_category, lambda { |category| { :include => :categories, :conditions => [ 'categories.id IN ?', category.is_a?(Array) ? category : Category.find_with_children(category) ] } }
  
  def self.paged_search(query, options = {})
    options.reverse_merge!(:per_page => 10)

    operator = created_after(options[:from]).
                in_locality(options[:locality]).
                with_category(options[:category])

    if query.blank?
      operator.paginate(:page => options[:page], :per_page => options[:per_page])
    else
      operator.search(query)
    end
  end
end

Your refactoring





Format Copy from initial code

or Cancel