2016-03-23 3 views
0

Нам нужно реализовать пользовательские фильтры для категорий в электронной коммерции в последней версии, как показано здесь https://github.com/spree/spree.Добавить несколько фильтров в Spree Commerce Rails

Нам нужно сделать это динамически, потому что у нас есть около 100 фильтров или больше. Идеальное решение - показать все доступные фильтры в области администрирования, а администратор может активировать/деактивировать их для каждой категории.

Текущий сценарий: Мы знаем, как создать новый фильтр и применить его. Но для каждого фильтра требуется около четырех методов, как показано в файле product_filter.rb, приведенном ниже.

Некоторые ссылки мы нашли полезным:

https://gist.github.com/maxivak/cc73b88699c9c6b45a95 https://github.com/radar/spree-core/blob/master/lib/spree/product_filters.rb

+0

Я решил эту проблему самостоятельно. Теперь я создаю динамические фильтры с помощью метапрограммирования. Создавайте фильтры во время выполнения. –

+0

любой намек, как вы достигли этого / – GorillaApe

ответ

0

Вот код, который позволяет фильтровать по нескольким свойствам. Это не идеально (нет правильной проверки и т. Д.), Но я думаю, что это лучше, чем выполнение нескольких «в» подзапросов.

 def add_search_scopes(base_scope) 
      joins = nil 
      conditions = nil 
      product_property_alias = nil 
      i = 1 
      search.each do |name, scope_attribute| 
       scope_name = name.to_sym 
       # If method is defined in product_filters 
       if base_scope.respond_to?(:search_scopes) && base_scope.search_scopes.include?(scope_name.to_sym) 
        base_scope = base_scope.send(scope_name, *scope_attribute) 
       else 
        next if scope_attribute.first.empty? 
        # Find property by name 
        property_name = name.gsub('_any', '').gsub('selective_', '') 
        property = Spree::Property.find_by_name(property_name) 
        next unless property 

        # Table joins 
        joins = product if joins.nil? 
        product_property_alias = product_property.alias("filter_product_property_#{i}") 
        joins = joins.join(product_property_alias).on(product[:id].eq(product_property_alias[:product_id])) 
        i += 1 

        # Conditions 
        condition = product_property_alias[:property_id].eq(property.id) 
                    .and(product_property_alias[:value].eq(scope_attribute)) 

        conditions = conditions.nil? ? condition : conditions.and(condition) 

       end 
      end if search.is_a?(Hash) 
      joins ? base_scope.joins(joins.join_sources).where(conditions) : base_scope 
     end 

     def prepare(params) 
      super 
      @properties[:product] = Spree::Product.arel_table 
      @properties[:product_property] = Spree::ProductProperty.arel_table 
     end 
Смежные вопросы