module Elasticsearch::Persistence::Model::Store::InstanceMethods

Public Instance Methods

becomes(klass) click to toggle source
# File lib/elasticsearch/persistence/model/store.rb, line 253
def becomes(klass)
  became = klass.new(attributes)
  changed_attributes = @changed_attributes if defined?(@changed_attributes)
  became.instance_variable_set("@changed_attributes", changed_attributes || {})
  became.instance_variable_set("@new_record", new_record?)
  became.instance_variable_set("@destroyed", destroyed?)
  became.instance_variable_set("@errors", errors)
  became.instance_variable_set("@persisted", persisted?)
  became.instance_variable_set("@_id", _id)
  became.instance_variable_set("@_version", _version)
  became.instance_variable_set("@_index", _index)
  became.instance_variable_set("@_type", _type)
  became
end
decrement(attribute, value = 1, options = {}) click to toggle source

Decrements a numeric attribute (via Elasticsearch’s “Update” API) and returns the response

@example Decrement the ‘salary` attribute by 1

p.decrement :salary

@example Decrement the ‘salary` attribute by 100

p.decrement :salary, 100

@return [Hash] The Elasticsearch response as a Hash

# File lib/elasticsearch/persistence/model/store.rb, line 180
def decrement(attribute, value = 1, options = {})
  raise DocumentNotPersisted, "Object not persisted: #{self.inspect}" unless persisted?

  options.update index: self._index if self._index
  options.update type: self._type if self._type

  response = self.class.gateway.update(self.id, { script: "ctx._source.#{attribute} = ctx._source.#{attribute} - #{value}" }.merge(options))
  self[attribute] -= value

  @_index = response["_index"]
  @_type = response["_type"]
  @_version = response["_version"]

  response
end
delete(options = {})
Alias for: destroy
destroy(options = {}) click to toggle source

Deletes the model from Elasticsearch (if it’s persisted), freezes it, and returns the response

@example Delete a model instance

p.destroy
=> {"_index"=>"people", ... "_id"=>"RzFSXFR0R8u1CZIWNs2Gvg", "_version"=>2 ...}

@return [Hash] The Elasticsearch response as a Hash

# File lib/elasticsearch/persistence/model/store.rb, line 90
def destroy(options = {})
  raise DocumentNotPersisted, "Object not persisted: #{self.inspect}" unless persisted?

  run_callbacks :destroy do
    options.update index: self._index if self._index
    options.update type: self._type if self._type

    response = self.class.gateway.delete(self.id, options)

    @destroyed = true
    @persisted = false
    self.freeze
    response
  end
end
Also aliased as: delete
destroyed?() click to toggle source

Returns true when the model has been destroyed, false otherwise

@return [TrueClass,FalseClass]

# File lib/elasticsearch/persistence/model/store.rb, line 233
def destroyed?
  !!@destroyed
end
increment(attribute, value = 1, options = {}) click to toggle source

Increments a numeric attribute (via Elasticsearch’s “Update” API) and returns the response

@example Increment the ‘salary` attribute by 1

p.increment :salary

@example Increment the ‘salary` attribute by 100

p.increment :salary, 100

@return [Hash] The Elasticsearch response as a Hash

# File lib/elasticsearch/persistence/model/store.rb, line 151
def increment(attribute, value = 1, options = {})
  raise DocumentNotPersisted, "Object not persisted: #{self.inspect}" unless persisted?

  options.update index: self._index if self._index
  options.update type: self._type if self._type

  response = self.class.gateway.update(self.id, { script: "ctx._source.#{attribute} += #{value}" }.merge(options))

  self[attribute] += value

  @_index = response["_index"]
  @_type = response["_type"]
  @_version = response["_version"]

  response
end
new_record?() click to toggle source

Returns true when the model has not been saved yet, false otherwise

@return [TrueClass,FalseClass]

# File lib/elasticsearch/persistence/model/store.rb, line 249
def new_record?
  !persisted? && !destroyed?
end
persisted?() click to toggle source

Returns true when the model has been already saved to the database, false otherwise

@return [TrueClass,FalseClass]

# File lib/elasticsearch/persistence/model/store.rb, line 241
def persisted?
  !!@persisted && !destroyed?
end
save(options = {}) click to toggle source

Saves the model (if validations pass) and returns the response (or ‘false`)

@example Save a valid model instance

p = Person.new(name: 'John')
p.save
=> {"_index"=>"people", ... "_id"=>"RzFSXFR0R8u1CZIWNs2Gvg", "_version"=>1, "created"=>true}

@example Save an invalid model instance

p = Person.new(name: nil)
p.save
# => false

@return [Hash,FalseClass] The Elasticsearch response as a Hash or ‘false`

# File lib/elasticsearch/persistence/model/store.rb, line 44
def save(options = {})
  return false unless valid?

  run_callbacks :save do
    options.update id: self.id
    options.update index: self._index if self._index
    options.update type: self._type if self._type

    if new_record?
      response = run_callbacks :create do
        response = self.class.gateway.save(self, options)
        self[:updated_at] = Time.now.utc

        @_id = response["_id"]
        @_index = response["_index"]
        @_type = response["_type"]
        @_version = response["_version"]
        @persisted = true

        response
      end
    else
      response = self.class.gateway.save(self, options)

      self[:updated_at] = Time.now.utc

      @_id = response["_id"]
      @_index = response["_index"]
      @_type = response["_type"]
      @_version = response["_version"]
      @persisted = true

      response
    end
  end
end
touch(attribute = :updated_at, options = {}) click to toggle source

Updates the ‘updated_at` attribute, saves the model and returns the response

@example Update the ‘updated_at` attribute (default)

p.touch

@example Update a custom attribute: ‘saved_on`

p.touch :saved_on

@return [Hash] The Elasticsearch response as a Hash

# File lib/elasticsearch/persistence/model/store.rb, line 208
def touch(attribute = :updated_at, options = {})
  raise DocumentNotPersisted, "Object not persisted: #{self.inspect}" unless persisted?
  raise ArgumentError, "Object does not have '#{attribute}' attribute" unless respond_to?(attribute)

  run_callbacks :touch do
    options.update index: self._index if self._index
    options.update type: self._type if self._type

    value = Time.now.utc
    response = self.class.gateway.update(self.id, { doc: { attribute => value.iso8601 } }.merge(options))

    self[attribute] = value

    @_index = response["_index"]
    @_type = response["_type"]
    @_version = response["_version"]

    response
  end
end
update(attributes = {}, options = {}) click to toggle source

Updates the model (via Elasticsearch’s “Update” API) and returns the response

@example Update a model with partial attributes

p.update name: 'UPDATED'
=> {"_index"=>"people", ... "_version"=>2}

@return [Hash] The Elasticsearch response as a Hash

# File lib/elasticsearch/persistence/model/store.rb, line 117
def update(attributes = {}, options = {})
  raise DocumentNotPersisted, "Object not persisted: #{self.inspect}" unless persisted?

  run_callbacks :update do
    options.update index: self._index if self._index
    options.update type: self._type if self._type

    attributes.update({ updated_at: Time.now.utc })

    response = self.class.gateway.update(self.id, { doc: attributes }.merge(options))

    self.attributes = self.attributes.merge(attributes)
    @_index = response["_index"]
    @_type = response["_type"]
    @_version = response["_version"]

    response
  end
end
Also aliased as: update_attributes
update_attributes(attributes = {}, options = {})
Alias for: update