Module: Elasticsearch::Model::Adapter::ActiveRecord::Records

Defined in:
lib/elasticsearch/model/adapters/active_record.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#optionsObject



15
16
17
# File 'lib/elasticsearch/model/adapters/active_record.rb', line 15

def options
  @options ||= {}
end

Instance Method Details

#loadObject

Prevent clash with ‘ActiveSupport::Dependencies::Loadable`



47
48
49
# File 'lib/elasticsearch/model/adapters/active_record.rb', line 47

def load
  records.__send__(:load)
end

#order(*args) ⇒ Object

Intercept call to the ‘order` method, so we can ignore the order from Elasticsearch



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/elasticsearch/model/adapters/active_record.rb', line 53

def order(*args)
  sql_records = records.__send__ :order, *args

  # Redefine the `to_a` method to the original one
  #
  sql_records.instance_exec do
    ar_records_method_name = :to_a
    ar_records_method_name = :records if defined?(::ActiveRecord) && ::ActiveRecord::VERSION::MAJOR >= 5

    define_singleton_method(ar_records_method_name) do
      if defined?(::ActiveRecord) && ::ActiveRecord::VERSION::MAJOR >= 4
        self.load
      else
        self.__send__(:exec_queries)
      end
      @records
    end
  end

  sql_records
end

#recordsObject

Returns an ‘ActiveRecord::Relation` instance



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/elasticsearch/model/adapters/active_record.rb', line 21

def records
  sql_records = klass.where(klass.primary_key => ids)
  sql_records = sql_records.includes(self.options[:includes]) if self.options[:includes]

  # Re-order records based on the order from Elasticsearch hits
  # by redefining `to_a`, unless the user has called `order()`
  #
  sql_records.instance_exec(response.response['hits']['hits']) do |hits|
    ar_records_method_name = :to_a
    ar_records_method_name = :records if defined?(::ActiveRecord) && ::ActiveRecord::VERSION::MAJOR >= 5

    define_singleton_method(ar_records_method_name) do
      if defined?(::ActiveRecord) && ::ActiveRecord::VERSION::MAJOR >= 4
        self.load
      else
        self.__send__(:exec_queries)
      end
      @records.sort_by { |record| hits.index { |hit| hit['_id'].to_s == record.id.to_s } }
    end if self
  end

  sql_records
end