Skip to content

Commit

Permalink
Moved filters to lib
Browse files Browse the repository at this point in the history
  • Loading branch information
Willianvdv committed Feb 2, 2014
1 parent 3a9e380 commit 91a246b
Show file tree
Hide file tree
Showing 4 changed files with 73 additions and 72 deletions.
72 changes: 0 additions & 72 deletions app/controllers/spree/taxons_controller_decorator.rb
Original file line number Diff line number Diff line change
@@ -1,75 +1,3 @@
module HStoreFilter
class Filter
attr_accessor :property

def initialize property, product_collection
@property = property
@product_collection = product_collection
end

def options
values.map do |value|
FilterOption.new value, @property, @product_collection
end
end

def values
@values ||= @product_collection
.joins(:product_properties)
.where('spree_product_properties.property_id = ?', @property.id)
.select('spree_product_properties.value')
.distinct('spree_product_properties.value')
.limit(nil)
.reorder(nil)
.pluck('spree_product_properties.value')
end
end

class FilterOption
attr_accessor :value, :property

def initialize value, property, product_collection
@value = value
@property = property
@product_collection = product_collection
end

def number_of_products
hstore_filter = ActiveRecord::Base::sanitize "#{@property.name}=>\"#{@value}\""
filter = "data @> #{hstore_filter}::hstore"
@number_of_products ||= @product_collection
.limit(nil)
.where(filter)
.count
end
end

class FilterScope
def initialize params, filterables, product_collection
@params = params
@filterables = filterables
@product_collection = product_collection
end

def filter
filters = []
@filterables.each do |filterable|
filters_per_filterable = []
property = filterable.property
@params[property.name].each do |value|
hstore_filter = ActiveRecord::Base::sanitize "#{property.name}=>\"#{value}\""
filters_per_filterable << "data @> #{hstore_filter}::hstore"
end

filters << filters_per_filterable.join(' OR ')
end

filter = filters.join(') AND (')
filters.empty? ? @product_collection : @product_collection.where("(#{filter})")
end
end
end

Spree::TaxonsController.class_eval do
def show_with_filter
show_without_filter
Expand Down
27 changes: 27 additions & 0 deletions lib/h_store_filter/filter.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
module HStoreFilter
class Filter
attr_accessor :property

def initialize property, product_collection
@property = property
@product_collection = product_collection
end

def options
values.map do |value|
FilterOption.new value, @property, @product_collection
end
end

def values
@values ||= @product_collection
.joins(:product_properties)
.where('spree_product_properties.property_id = ?', @property.id)
.select('spree_product_properties.value')
.distinct('spree_product_properties.value')
.limit(nil)
.reorder(nil)
.pluck('spree_product_properties.value')
end
end
end
20 changes: 20 additions & 0 deletions lib/h_store_filter/filter_option.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
module HStoreFilter
class FilterOption
attr_accessor :value, :property

def initialize value, property, product_collection
@value = value
@property = property
@product_collection = product_collection
end

def number_of_products
hstore_filter = ActiveRecord::Base::sanitize "#{@property.name}=>\"#{@value}\""
filter = "data @> #{hstore_filter}::hstore"
@number_of_products ||= @product_collection
.limit(nil)
.where(filter)
.count
end
end
end
26 changes: 26 additions & 0 deletions lib/h_store_filter/filter_scope.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
module HStoreFilter
class FilterScope
def initialize params, filterables, product_collection
@params = params
@filterables = filterables
@product_collection = product_collection
end

def filter
filters = []
@filterables.each do |filterable|
filters_per_filterable = []
property = filterable.property
@params[property.name].each do |value|
hstore_filter = ActiveRecord::Base::sanitize "#{property.name}=>\"#{value}\""
filters_per_filterable << "data @> #{hstore_filter}::hstore"
end

filters << filters_per_filterable.join(' OR ')
end

filter = filters.join(') AND (')
filters.empty? ? @product_collection : @product_collection.where("(#{filter})")
end
end
end

0 comments on commit 91a246b

Please sign in to comment.