Class: Sunspot::DSL::Fields
- Inherits:
-
Object
- Object
- Sunspot::DSL::Fields
- Defined in:
- lib/sunspot/dsl/fields.rb
Overview
The Fields class provides a DSL for specifying field definitions in the Sunspot.setup block. As well as the #text method, which creates fulltext fields, uses #method_missing to allow definition of typed fields. The available methods are determined by the constants defined in Sunspot::Type - in theory (though this is untested), plugin developers should be able to add support for new types simply by creating new implementations in Sunspot::Type
Instance Method Summary collapse
-
#boost(attr_name = nil, &block) ⇒ Object
Specify a document-level boost.
-
#initialize(setup) ⇒ Fields
constructor
:nodoc:.
-
#method_missing(method, *args, &block) ⇒ Object
method_missing is used to provide access to typed fields, because developers should be able to add new Sunspot::Type implementations dynamically and have them recognized inside the Fields DSL.
-
#text(*names, &block) ⇒ Object
Add a text field.
Constructor Details
#initialize(setup) ⇒ Fields
:nodoc:
12 13 14 |
# File 'lib/sunspot/dsl/fields.rb', line 12 def initialize(setup) #:nodoc: @setup = setup end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(method, *args, &block) ⇒ Object
method_missing is used to provide access to typed fields, because developers should be able to add new Sunspot::Type implementations dynamically and have them recognized inside the Fields DSL. Like #text, these methods will create a VirtualField if a block is passed, or an AttributeField if not.
Example
Sunspot.setup(File) do
time :mtime
end
The call to time
will create a field of type Sunspot::Types::TimeType
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
# File 'lib/sunspot/dsl/fields.rb', line 75 def method_missing(method, *args, &block) = Util.(args) if method.to_s == 'join' type_string = .delete(:type).to_s else type_string = method.to_s end type_const_name = "#{Util.camel_case(type_string.sub(/^dynamic_/, ''))}Type" trie = .delete(:trie) type_const_name = "Trie#{type_const_name}" if trie begin type_class = [:type] type_class = Type.const_get(type_const_name) rescue(NameError) if trie raise ArgumentError, "Trie fields are only valid for numeric and time types" else super(method, *args, &block) end end type = type_class.instance name = args.shift if method.to_s =~ /^dynamic_/ if type.accepts_dynamic? @setup.add_dynamic_field_factory(name, type, , &block) else super(method, *args, &block) end elsif method.to_s == 'join' @setup.add_join_field_factory(name, type, , &block) else @setup.add_field_factory(name, type, , &block) end end |
Instance Method Details
#boost(attr_name = nil, &block) ⇒ Object
Specify a document-level boost. As with fields, you have the option of passing an attribute name which will be called on each model, or a block to be evaluated in the model’s context. As well as these two options, this method can also take a constant number, meaning that all indexed documents of this class will have the specified boost.
Parameters
- attr_name<Symbol,~.to_f>
-
Attribute name to call or a numeric constant
57 58 59 |
# File 'lib/sunspot/dsl/fields.rb', line 57 def boost(attr_name = nil, &block) @setup.add_document_boost(attr_name, &block) end |
#text(*names, &block) ⇒ Object
Add a text field. Text fields are tokenized before indexing and are the only fields searched in fulltext searches. If a block is passed, create a virtual field; otherwise create an attribute field.
If options are passed, they will be applied to all the given fields.
Parameters
- names…<Symbol>
-
One or more field names
Options
- :boost<Float>
-
Index-time boost that should be applied to this field for keyword search
- :default_boost<Float>
-
Default search-time boost to apply to this field during keyword search. Can be overriden with DSL::Fulltext#fields or DSL::Fulltext#boost_fields method.
35 36 37 38 39 40 41 42 43 44 |
# File 'lib/sunspot/dsl/fields.rb', line 35 def text(*names, &block) = names.pop if names.last.is_a?(Hash) names.each do |name| @setup.add_text_field_factory( name, || {}, &block ) end end |