Module: OssActiveRecord::Searchable::ClassMethods

Defined in:
lib/oss_active_record/searchable.rb

Constant Summary collapse

@@oss_field_types =

supported field types

[:integer, :text, :string, :time, :suggestion]
@@oss_mutex =
Mutex.new

Instance Method Summary collapse

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method, *args, &block) ⇒ Object



34
35
36
37
# File 'lib/oss_active_record/searchable.rb', line 34

def method_missing(method, *args, &block)
  return index_instance.add_field(args[0], method, block) if @@oss_field_types.include? method
  super
end

Instance Method Details

#find_results(search_result, field_id, options) ⇒ Object



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/oss_active_record/searchable.rb', line 47

def find_results(search_result, field_id, options)
  id_field_name = "#{field_id[:name]}|#{field_id[:type]}"

  ids = search_result['documents'].map do |document|
    field = document['fields'].find { |f| f['fieldName'] == id_field_name }
    field['values'].compact.first
  end.compact

  query = if options[:include]
    unscoped.includes(options[:include])
  else
    unscoped
  end
  records = query.find(ids)

  ids.map do |id|
    records.find { |record| record.id == id.to_i }
  end
end

#index_instanceObject



22
23
24
25
26
# File 'lib/oss_active_record/searchable.rb', line 22

def index_instance
  @@oss_mutex.synchronize do
    @index_instance ||= IndexInstance.new(self.name.downcase)
  end
end

#oss_search(*args, &block) ⇒ Object Also known as: search



39
40
41
42
43
44
# File 'lib/oss_active_record/searchable.rb', line 39

def oss_search(*args, &block)
  options = args.extract_options!
  search_request = SearchRequest.new(index_instance)
  search_request.returns index_instance.fields.map { |f| "#{f[:name]}|#{f[:type]}" }
  find_results(search_request.execute(&block), index_instance.field_id, options)
end

#reindex!Object



28
29
30
31
32
# File 'lib/oss_active_record/searchable.rb', line 28

def reindex!
  index_instance.oss_index.delete!
  index_instance.create_schema!
  self.all.find_in_batches { |group| group.each(&:index) }
end

#searchable(options = {}, &block) ⇒ Object



15
16
17
18
19
20
# File 'lib/oss_active_record/searchable.rb', line 15

def searchable(options = {}, &block)
  yield
  unless options[:auto_index] == false
    after_commit :index
  end
end