Sha256: ca96e160c6f3f037d7bf804e9b6720430a65e768beb9e927bbb9001bd7b482c7

Contents?: true

Size: 922 Bytes

Versions: 86

Compression:

Stored size: 922 Bytes

Contents

module Dorsale
  module Search
    def self.included(klass)
      klass.send(:extend, Dorsale::Search::ClassMethods)
    end
    
    module ClassMethods
      def default_search_fields
        fields = columns.map do |column|
          "#{table_name}.#{column.name}"
        end
      end
      
      def search(q, *fields)
        words  = q.to_s.parameterize.split("-")
        fields = default_search_fields if fields.empty?
        
        sql_query = words.map.with_index do |word, index|
          fields.map do |field|
            "(LOWER(CAST(#{field} AS TEXT)) LIKE :w#{index})"
          end.join(" OR ")
        end.map{ |e| "(#{e})" }.join(" AND ")
        
        sql_params_a = words.map.with_index do |word, index|
          ["w#{index}".to_sym, "%#{word}%"]
        end
        
        sql_params_h = Hash[sql_params_a]
        
        self.where(sql_query, sql_params_h)
      end
    end
  end
end

Version data entries

86 entries across 86 versions & 1 rubygems

Version Path
dorsale-3.3.0 lib/dorsale/search.rb
dorsale-3.2.0 lib/dorsale/search.rb
dorsale-3.1.7 lib/dorsale/search.rb
dorsale-3.1.6 lib/dorsale/search.rb
dorsale-3.1.5 lib/dorsale/search.rb
dorsale-3.1.4 lib/dorsale/search.rb
dorsale-3.1.3 lib/dorsale/search.rb
dorsale-3.1.2 lib/dorsale/search.rb
dorsale-3.1.1 lib/dorsale/search.rb
dorsale-3.1.0 lib/dorsale/search.rb
dorsale-3.0.3 lib/dorsale/search.rb
dorsale-3.0.2 lib/dorsale/search.rb
dorsale-3.0.1 lib/dorsale/search.rb
dorsale-3.0.0 lib/dorsale/search.rb
dorsale-2.7.3 lib/dorsale/search.rb
dorsale-2.7.2 lib/dorsale/search.rb
dorsale-2.7.1 lib/dorsale/search.rb
dorsale-2.7.0 lib/dorsale/search.rb
dorsale-2.6.8 lib/dorsale/search.rb
dorsale-2.6.7 lib/dorsale/search.rb