Module: Elasticsearch::Model::Proxy

Defined in:
lib/elasticsearch/model/proxy.rb

Overview

This module provides a proxy interfacing between the including class and Elasticsearch::Model, preventing the pollution of the including class namespace.

The only “gateway” between the model and Elasticsearch::Model is the ‘__elasticsearch__` class and instance method.

The including class must be compatible with [ActiveModel](github.com/rails/rails/tree/master/activemodel).

Examples:

Include the Elasticsearch::Model module into an ‘Article` model


class Article < ActiveRecord::Base
  include Elasticsearch::Model
end

Article.__elasticsearch__.respond_to?(:search)
# => true

article = Article.first

article.respond_to? :index_document
# => false

article.__elasticsearch__.respond_to?(:index_document)
# => true

Defined Under Namespace

Modules: Base Classes: ClassMethodsProxy, InstanceMethodsProxy

Class Method Summary collapse

Class Method Details

.included(base) ⇒ Object

Note:

The callback is triggered only when ‘Elasticsearch::Model` is included in the module and the functionality is accessible via the proxy.

Define the ‘__elasticsearch__` class and instance methods in the including class and register a callback for intercepting changes in the model.



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/elasticsearch/model/proxy.rb', line 38

def self.included(base)
  base.class_eval do
    # {ClassMethodsProxy} instance, accessed as `MyModel.__elasticsearch__`
    #
    def self.__elasticsearch__ &block
      @__elasticsearch__ ||= ClassMethodsProxy.new(self)
      @__elasticsearch__.instance_eval(&block) if block_given?
      @__elasticsearch__
    end

    # {InstanceMethodsProxy}, accessed as `@mymodel.__elasticsearch__`
    #
    def __elasticsearch__ &block
      @__elasticsearch__ ||= InstanceMethodsProxy.new(self)
      @__elasticsearch__.instance_eval(&block) if block_given?
      @__elasticsearch__
    end

    # Register a callback for storing changed attributes for models which implement
    # `before_save` and `changed_attributes` methods (when `Elasticsearch::Model` is included)
    #
    # @see http://api.rubyonrails.org/classes/ActiveModel/Dirty.html
    #
    before_save do |i|
      i.__elasticsearch__.instance_variable_set(:@__changed_attributes,
                                                Hash[ i.changes.map { |key, value| [key, value.last] } ])
    end if respond_to?(:before_save) && instance_methods.include?(:changed_attributes)
  end
end