Commit 245398e94e1b58a2b0f0789ae4fc5dc174f0686a
1 parent
ea9448c0
Exists in
master
and in
23 other branches
Add acts_as_faceted lib for declaring facets
Showing
2 changed files
with
72 additions
and
0 deletions
Show diff stats
config/initializers/dependencies.rb
| @@ -0,0 +1,71 @@ | @@ -0,0 +1,71 @@ | ||
| 1 | +module ActsAsFaceted | ||
| 2 | + | ||
| 3 | + module ClassMethods | ||
| 4 | + end | ||
| 5 | + | ||
| 6 | + module ActsMethods | ||
| 7 | + # === fields: | ||
| 8 | + # A hash of id fields (may be an attribute or a method). | ||
| 9 | + # === order: | ||
| 10 | + # An array | ||
| 11 | + # Example: | ||
| 12 | + # | ||
| 13 | + # acts_as_faceted :fields => {:f_category_id => {:class => ProductCategory, :display_field => :name, :label => _('Related products')}, | ||
| 14 | + # :f_region_id => {:class => Region, :display_field => :name, :label => _('Region')}, | ||
| 15 | + # :f_qualifier_id => {:class => Qualifier, :display_field => :name, :label => _('Qualifiers')}, | ||
| 16 | + # :f_certifier_id => {:class => Certifier, :display_field => :name, :label => _('Certifiers')}}, | ||
| 17 | + # :order => [:f_category_id, :f_region_id, :f_qualifier_id, :f_certifier_id] | ||
| 18 | + # end | ||
| 19 | + def acts_as_faceted(options) | ||
| 20 | + extend ClassMethods | ||
| 21 | + | ||
| 22 | + cattr_accessor :facets | ||
| 23 | + cattr_accessor :facets_order | ||
| 24 | + cattr_accessor :solr_facet_fields | ||
| 25 | + cattr_accessor :to_solr_facet_fields | ||
| 26 | + | ||
| 27 | + self.facets = options[:fields] | ||
| 28 | + self.facets_order = options[:order] || facets | ||
| 29 | + | ||
| 30 | + # A hash to retrieve the field key for the solr facet string returned | ||
| 31 | + # "field_name_facet" => :field_name | ||
| 32 | + self.solr_facet_fields = Hash[facets.keys.map{|f| f.to_s+'_facet'}.zip(facets.keys)] | ||
| 33 | + # :field_name => "field_name_facet" | ||
| 34 | + self.to_solr_facet_fields = Hash[facets.keys.zip(facets.keys.map{|f| f.to_s+'_facet'})] | ||
| 35 | + | ||
| 36 | + def each_facet | ||
| 37 | + if facets_order | ||
| 38 | + facets_order.each_with_index { |f, i| yield [f, i] } | ||
| 39 | + else | ||
| 40 | + facets.each_with_index { |f, i| yield [f. i] } | ||
| 41 | + end | ||
| 42 | + end | ||
| 43 | + | ||
| 44 | + def each_facet_obj(solr_facet, id_hash, options = {}) | ||
| 45 | + facet = facets[solr_facet_fields[solr_facet]] | ||
| 46 | + klass = facet[:class] | ||
| 47 | + | ||
| 48 | + if options[:sort] == :alphabetically | ||
| 49 | + display_field = facet[:display_field] | ||
| 50 | + result = [] | ||
| 51 | + id_hash.each do |id, count| | ||
| 52 | + obj = klass.find_by_id(id) | ||
| 53 | + result << [obj, count] if obj | ||
| 54 | + end | ||
| 55 | + result = result.sort { |a,b| a[0].send(display_field) <=> b[0].send(display_field) } | ||
| 56 | + result.each { |obj, count| yield [obj, count] } | ||
| 57 | + else | ||
| 58 | + result = options[:sort] == :count ? id_hash.sort{ |a,b| -1*(a[1] <=> b[1]) } : id_hash | ||
| 59 | + result.each do |id, count| | ||
| 60 | + obj = klass.find_by_id(id) | ||
| 61 | + yield [obj, count] if obj | ||
| 62 | + end | ||
| 63 | + end | ||
| 64 | + end | ||
| 65 | + end | ||
| 66 | + end | ||
| 67 | + | ||
| 68 | +end | ||
| 69 | + | ||
| 70 | +ActiveRecord::Base.extend ActsAsFaceted::ActsMethods | ||
| 71 | + |