Sha256: 82bd4754c692497a67970a366adfed2c3b784082b06010fb544865153690f7cd

Contents?: true

Size: 1.02 KB

Versions: 3

Compression:

Stored size: 1.02 KB

Contents

module Comable
  class Product
    module Search
      extend ActiveSupport::Concern

      SEARCH_COLUMNS = %i( name caption )

      module ClassMethods
        def search(query)
          keywords = parse_to_keywords(query)
          return (Rails::VERSION::MAJOR == 3) ? scoped : all if keywords.empty?
          where(keywords_to_arel(keywords))
        end

        private

        def keywords_to_arel(keywords)
          keywords.inject(nil) do |arel_chain, keyword|
            arel = keyword_to_arel(keyword)
            arel_chain ? arel_chain.and(arel) : arel
          end
        end

        def keyword_to_arel(keyword)
          SEARCH_COLUMNS.inject(nil) do |arel_chain, column|
            arel = arel_table[column].matches("%#{keyword}%")
            arel_chain ? arel_chain.or(arel) : arel
          end
        end

        def parse_to_keywords(query)
          return [] if query.blank?
          query
            .delete('%')
            .tr(' ', ' ')
            .split(' ')
        end
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
comable-core-0.7.1 app/models/concerns/comable/product/search.rb
comable-core-0.7.0 app/models/concerns/comable/product/search.rb
comable-core-0.7.0.beta2 app/models/concerns/comable/product/search.rb