Sha256: c3e6b09db9ef06d1081359fc4e6c946a6e5e897585dc01a0cb12aadea9dbd4a0

Contents?: true

Size: 1.97 KB

Versions: 87

Compression:

Stored size: 1.97 KB

Contents

# frozen_string_literal: true

require 'active_support/core_ext/class/attribute'

module Spree
  module Core
    module Search
      #
      # NOTE: Use Spree::Config.variant_search_class rather than referencing this
      # directly.
      #

      class Variant
        class_attribute :search_terms
        self.search_terms = [
          :sku_cont,
          :product_name_cont,
          :product_slug_cont,
          :option_values_presentation_cont,
          :option_values_name_cont
        ]

        def initialize(query_string, scope: Spree::Variant.all)
          @query_string = query_string
          @scope = scope
        end

        # Searches the variants table using the ransack 'search_terms' defined on the class.
        # Each word of the query string is searched individually, matching by a union of the ransack
        # search terms, then we find the intersection of those queries, ensuring that each word matches
        # one of the rules.
        #
        # == Returns:
        # ActiveRecord::Relation of variants
        def results
          return @scope if @query_string.blank?

          matches = @query_string.split.map do |word|
            @scope.ransack(search_term_params(word)).result.pluck(:id)
          end

          Spree::Variant.where(id: matches.inject(:&))
        end

        private

        # Returns an array of search term symbols that will be passed to Ransack
        # to query the DB for the given word.
        # Subclasses may override this to allow conditional filtering, etc.
        #
        # @api public
        # @param _word [String] One of the search words provided by the user.
        #   e.g. a SKU
        # @return [Array<Symbol>] the list of search terms to use for this word
        def search_terms(_word)
          self.class.search_terms
        end

        def search_term_params(word)
          terms = Hash[search_terms(word).map { |term| [term, word] }]
          terms.merge(m: 'or')
        end
      end
    end
  end
end

Version data entries

87 entries across 87 versions & 1 rubygems

Version Path
solidus_core-4.3.4 lib/spree/core/search/variant.rb
solidus_core-4.2.4 lib/spree/core/search/variant.rb
solidus_core-4.1.5 lib/spree/core/search/variant.rb
solidus_core-4.3.3 lib/spree/core/search/variant.rb
solidus_core-4.3.2 lib/spree/core/search/variant.rb
solidus_core-4.1.4 lib/spree/core/search/variant.rb
solidus_core-4.3.1 lib/spree/core/search/variant.rb
solidus_core-4.3.0 lib/spree/core/search/variant.rb
solidus_core-4.2.3 lib/spree/core/search/variant.rb
solidus_core-4.1.3 lib/spree/core/search/variant.rb
solidus_core-4.0.4 lib/spree/core/search/variant.rb
solidus_core-3.4.6 lib/spree/core/search/variant.rb
solidus_core-4.0.3 lib/spree/core/search/variant.rb
solidus_core-4.1.2 lib/spree/core/search/variant.rb
solidus_core-4.2.2 lib/spree/core/search/variant.rb
solidus_core-3.4.5 lib/spree/core/search/variant.rb
solidus_core-4.2.1 lib/spree/core/search/variant.rb
solidus_core-4.2.0 lib/spree/core/search/variant.rb
solidus_core-4.1.1 lib/spree/core/search/variant.rb
solidus_core-4.0.2 lib/spree/core/search/variant.rb