module Elasticsearch::Persistence::Model::Store::InstanceMethods
Public Instance Methods
# 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
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
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
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
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
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
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
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
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
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