class Spree::Core::Search::Base

Attributes

current_currency[RW]
current_user[RW]
properties[RW]

Public Class Methods

new(params) click to toggle source
# File lib/spree/core/search/base.rb, line 9
def initialize(params)
  self.current_currency = Spree::Config[:currency]
  @properties = {}
  prepare(params)
end

Public Instance Methods

method_missing(name) click to toggle source
Calls superclass method
# File lib/spree/core/search/base.rb, line 26
def method_missing(name)
  if @properties.key? name
    @properties[name]
  else
    super
  end
end
retrieve_products() click to toggle source
# File lib/spree/core/search/base.rb, line 15
def retrieve_products
  @products = extended_base_scope&.available
  curr_page = page || 1

  unless Spree::Config.show_products_without_price
    @products = @products.where('spree_prices.amount IS NOT NULL').
                where('spree_prices.currency' => current_currency)
  end
  @products = @products.page(curr_page).per(per_page)
end

Protected Instance Methods

add_eagerload_scopes(scope) click to toggle source
# File lib/spree/core/search/base.rb, line 56
def add_eagerload_scopes(scope)
  scope = scope.includes(
    :tax_category,
    variants: [
      { images: { attachment_attachment: :blob } }
    ],
    master: [
      :prices,
      { images: { attachment_attachment: :blob } }
    ]
  )
  scope
end
add_search_scopes(base_scope) click to toggle source
# File lib/spree/core/search/base.rb, line 70
def add_search_scopes(base_scope)
  if search.is_a?(ActionController::Parameters)
    search.each do |name, scope_attribute|
      scope_name = name.to_sym

      base_scope = if base_scope.respond_to?(:search_scopes) && base_scope.search_scopes.include?(scope_name.to_sym)
                     base_scope.send(scope_name, *scope_attribute)
                   else
                     base_scope.merge(Spree::Product.ransack(scope_name => scope_attribute).result)
                   end
    end
  end
  base_scope
end
build_option_value_ids(params) click to toggle source
# File lib/spree/core/search/base.rb, line 115
def build_option_value_ids(params)
  filter_params = Spree::OptionType.all.map(&:filter_param)

  filter_params.reduce([]) do |acc, filter_param|
    acc + params[filter_param].to_s.split(',')
  end
end
extended_base_scope() click to toggle source
# File lib/spree/core/search/base.rb, line 36
def extended_base_scope
  base_scope = Spree::Product.spree_base_scopes.active
  base_scope = get_products_conditions_for(base_scope, keywords)
  base_scope = Spree::Dependencies.products_finder.constantize.new(
    scope: base_scope,
    params: {
      filter: {
        price: price,
        option_value_ids: option_value_ids,
        taxons: taxon&.id
      },
      sort_by: sort_by
    },
    current_currency: current_currency
  ).execute
  base_scope = add_search_scopes(base_scope)
  base_scope = add_eagerload_scopes(base_scope)
  base_scope
end
get_price_range(price_param) click to toggle source
# File lib/spree/core/search/base.rb, line 100
def get_price_range(price_param)
  return if price_param.blank?

  less_than_string = I18n.t('activerecord.attributes.spree/product.less_than')

  if price_param.include? less_than_string
    low_price = 0
    high_price = Monetize.parse(price_param.remove("#{less_than_string} ")).to_i
  else
    low_price, high_price = Monetize.parse_collection(price_param).map(&:to_i)
  end

  "#{low_price},#{high_price}"
end
get_products_conditions_for(base_scope, query) click to toggle source

method should return new scope based on base_scope

# File lib/spree/core/search/base.rb, line 86
def get_products_conditions_for(base_scope, query)
  unless query.blank?
    base_scope = base_scope.like_any([:name, :description], [query])
  end
  base_scope
end
get_products_option_values_conditions(base_scope, option_value_ids) click to toggle source
# File lib/spree/core/search/base.rb, line 93
def get_products_option_values_conditions(base_scope, option_value_ids)
  unless option_value_ids.blank?
    base_scope = base_scope.joins(variants: :option_values).where(spree_option_values: { id: option_value_ids })
  end
  base_scope
end
prepare(params) click to toggle source
# File lib/spree/core/search/base.rb, line 123
def prepare(params)
  @properties[:taxon] = params[:taxon].blank? ? nil : Spree::Taxon.find(params[:taxon])
  @properties[:keywords] = params[:keywords]
  @properties[:option_value_ids] = build_option_value_ids(params)
  @properties[:price] = get_price_range(params[:price])
  @properties[:search] = params[:search]
  @properties[:sort_by] = params[:sort_by] || 'default'
  @properties[:include_images] = params[:include_images]

  per_page = params[:per_page].to_i
  @properties[:per_page] = per_page > 0 ? per_page : Spree::Config[:products_per_page]
  @properties[:page] = if params[:page].respond_to?(:to_i)
                         params[:page].to_i <= 0 ? 1 : params[:page].to_i
                       else
                         1
                       end
end