在Spree Commerce Rails中添加多个过滤器

时间:2016-03-23 11:15:54

标签: ruby-on-rails spree

我们需要在最新版本的狂欢电子商务中为类别实施自定义过滤器,如https://github.com/spree/spree所示。

我们需要以动态的方式进行,因为我们有大约100个或更多的过滤器。理想的解决方案是在管理区域显示所有可用的过滤器,管理员可以为每个类别激活/停用它们。

当前场景: 我们知道如何制作新的过滤器并应用它。但是每个过滤器需要大约四种方法,如下面链接的product_filter.rb文件所示。

我们发现一些有用的链接:

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

1 个答案:

答案 0 :(得分: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