2016-03-23 9 views
0

Wir müssen benutzerdefinierte Filter für Kategorien in spree E-Commerce in der neuesten Version implementieren, wie hier zu sehen https://github.com/spree/spree.Mehrere Filter in Spree Commerce Rails hinzufügen

Wir müssen es auf eine dynamische Art und Weise tun, weil wir etwa 100 Filter oder mehr zu machen haben. Die ideale Lösung wäre, alle verfügbaren Filter im Admin-Bereich anzuzeigen, und der Administrator kann sie für jede Kategorie aktivieren/deaktivieren.

Aktuelles Szenario: Wir wissen, wie man einen neuen Filter erstellt und anwendet. Aber es dauert ungefähr vier Methoden pro Filter, wie in der unten verlinkten Datei product_filter.rb gezeigt.

Einige Links haben wir nützlich gefunden:

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

+0

Ich habe dieses Problem selbst gelöst. Jetzt erstelle ich dynamische Filter durch Meta-Programmierung. Erstellen Sie zur Laufzeit Filter. –

+0

ein Hinweis, wie Sie das erreicht haben / – GorillaApe

Antwort

0

Hier einige Code, den Sie durch mehrere Eigenschaften filtern können. Es ist nicht ideal (keine korrekte Validierung etc), aber ich denke, es ist besser als mehrere "in" Unterabfragen.

 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