Commit 245398e94e1b58a2b0f0789ae4fc5dc174f0686a

Authored by Braulio Bhavamitra
1 parent ea9448c0

Add acts_as_faceted lib for declaring facets

config/initializers/dependencies.rb
1 1 # locally-developed modules
  2 +require 'acts_as_faceted'
2 3 require 'acts_as_filesystem'
3 4 require 'acts_as_having_settings'
4 5 require 'acts_as_searchable'
... ...
lib/acts_as_faceted.rb 0 → 100644
... ... @@ -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 +
... ...