module Elasticsearch::Model

Elasticsearch integration for Ruby models

‘Elasticsearch::Model` contains modules for integrating the Elasticsearch search and analytical engine with ActiveModel-based classes, or models, for the Ruby programming language.

It facilitates importing your data into an index, automatically updating it when a record changes, searching the specific index, setting up the index mapping or the model JSON serialization.

When the ‘Elasticsearch::Model` module is included in your class, it automatically extends it with the functionality; see {Elasticsearch::Model.included}. Most methods are available via the `__elasticsearch__` class and instance method proxies.

It is possible to include/extend the model with the corresponding modules directly, if that is desired:

MyModel.__send__ :extend,  Elasticsearch::Model::Client::ClassMethods
MyModel.__send__ :include, Elasticsearch::Model::Client::InstanceMethods
MyModel.__send__ :extend,  Elasticsearch::Model::Searching::ClassMethods
# ...

Constants

METHODS
VERSION

Public Class Methods

included(base) click to toggle source

Adds the ‘Elasticsearch::Model` functionality to the including class.

  • Creates the ‘__elasticsearch__` class and instance methods, pointing to the proxy object

  • Includes the necessary modules in the proxy classes

  • Sets up delegation for crucial methods such as ‘search`, etc.

@example Include the module in the ‘Article` model definition

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

@example Inject the module into the ‘Article` model during run time

Article.__send__ :include, Elasticsearch::Model
# File lib/elasticsearch/model.rb, line 84
    def self.included(base)
      base.class_eval do
        include Elasticsearch::Model::Proxy

        Elasticsearch::Model::Proxy::ClassMethodsProxy.class_eval do
          include Elasticsearch::Model::Client::ClassMethods
          include Elasticsearch::Model::Naming::ClassMethods
          include Elasticsearch::Model::Indexing::ClassMethods
          include Elasticsearch::Model::Searching::ClassMethods
        end

        Elasticsearch::Model::Proxy::InstanceMethodsProxy.class_eval do
          include Elasticsearch::Model::Client::InstanceMethods
          include Elasticsearch::Model::Naming::InstanceMethods
          include Elasticsearch::Model::Indexing::InstanceMethods
          include Elasticsearch::Model::Serializing::InstanceMethods
        end

        Elasticsearch::Model::Proxy::InstanceMethodsProxy.class_eval <<-CODE, __FILE__, __LINE__ + 1
          def as_indexed_json(options={})
            target.respond_to?(:as_indexed_json) ? target.__send__(:as_indexed_json, options) : super
          end
        CODE

        # Delegate important methods to the `__elasticsearch__` proxy, unless they are defined already
        #
        class << self
          METHODS.each do |method|
            delegate method, to: :__elasticsearch__ unless self.public_instance_methods.include?(method)
          end
        end

        # Mix the importing module into the proxy
        #
        self.__elasticsearch__.class_eval do
          include Elasticsearch::Model::Importing::ClassMethods
          include Adapter.from_class(base).importing_mixin
        end
      end
    end