75 lines
1.9 KiB
Ruby
75 lines
1.9 KiB
Ruby
# config/initializers/sunspot.rb
|
|
module Sunspot
|
|
#
|
|
# DataExtractors present an internal API for the indexer to use to extract
|
|
# field values from models for indexing. They must implement the #value_for
|
|
# method, which takes an object and returns the value extracted from it.
|
|
#
|
|
module DataExtractor #:nodoc: all
|
|
#
|
|
# AttributeExtractors extract data by simply calling a method on the block.
|
|
#
|
|
class AttributeExtractor
|
|
def initialize(attribute_name)
|
|
@attribute_name = attribute_name
|
|
end
|
|
|
|
def value_for(object)
|
|
Filter.new( object.send(@attribute_name) ).value
|
|
end
|
|
end
|
|
#
|
|
# BlockExtractors extract data by evaluating a block in the context of the
|
|
# object instance, or if the block takes an argument, by passing the object
|
|
# as the argument to the block. Either way, the return value of the block is
|
|
# the value returned by the extractor.
|
|
#
|
|
class BlockExtractor
|
|
def initialize(&block)
|
|
@block = block
|
|
end
|
|
|
|
def value_for(object)
|
|
Filter.new( Util.instance_eval_or_call(object, &@block) ).value
|
|
end
|
|
end
|
|
|
|
#
|
|
# Constant data extractors simply return the same value for every object.
|
|
#
|
|
class Constant
|
|
def initialize(value)
|
|
@value = value
|
|
end
|
|
|
|
def value_for(object)
|
|
Filter.new(@value).value
|
|
end
|
|
end
|
|
|
|
#
|
|
# A Filter to allow easy value cleaning
|
|
#
|
|
class Filter
|
|
def initialize(value)
|
|
@value = value
|
|
end
|
|
def value
|
|
strip_control_characters @value
|
|
end
|
|
def strip_control_characters(value)
|
|
return value unless value.is_a? String
|
|
|
|
value.chars.inject("") do |str, char|
|
|
unless char.ascii_only? and (char.ord < 32 or char.ord == 127)
|
|
str << char
|
|
end
|
|
str
|
|
end
|
|
|
|
end
|
|
end
|
|
|
|
end
|
|
end
|