我们需要在最新版本的狂欢电子商务中为类别实施自定义过滤器,如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
答案 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