module Modis::Persistence

Attributes

sti_child[R]
sti_child?[R]

Public Class Methods

included(base) click to toggle source
# File lib/modis/persistence.rb, line 5
def self.included(base)
  base.extend ClassMethods
  base.instance_eval do
    class << self
      attr_reader :sti_child
      alias sti_child? sti_child
    end
  end
end

Public Instance Methods

destroy() click to toggle source
# File lib/modis/persistence.rb, line 135
def destroy
  self.class.transaction do |redis|
    run_callbacks :destroy do
      redis.pipelined do
        remove_from_indexes(redis)
        if self.class.all_index_enabled?
          redis.srem(self.class.key_for(:all), id)
          redis.srem(self.class.sti_base_key_for(:all), id) if self.class.sti_child?
        end
        redis.del(key)
      end
    end
  end
end
key() click to toggle source
# File lib/modis/persistence.rb, line 115
def key
  return nil if new_record?

  self.class.sti_child? ? self.class.sti_base_key_for(id) : self.class.key_for(id)
end
new_record?() click to toggle source
# File lib/modis/persistence.rb, line 121
def new_record?
  defined?(@new_record) ? @new_record : true
end
persisted?() click to toggle source
# File lib/modis/persistence.rb, line 111
def persisted?
  true
end
reload() click to toggle source
# File lib/modis/persistence.rb, line 150
def reload
  new_attributes = Modis.with_connection { |redis| self.class.attributes_for(redis, id) }
  initialize(new_attributes)
  self
end
save(args = {}) click to toggle source
# File lib/modis/persistence.rb, line 125
def save(args = {})
  create_or_update(args)
rescue Modis::RecordInvalid
  false
end
save!(args = {}) click to toggle source
# File lib/modis/persistence.rb, line 131
def save!(args = {})
  create_or_update(args) || (raise RecordNotSaved)
end
update(attrs) click to toggle source
# File lib/modis/persistence.rb, line 161
def update(attrs)
  assign_attributes(attrs)
  save
end
Also aliased as: update_attributes
update!(attrs) click to toggle source
# File lib/modis/persistence.rb, line 169
def update!(attrs)
  assign_attributes(attrs)
  save!
end
Also aliased as: update_attributes!
update_attribute(name, value) click to toggle source
# File lib/modis/persistence.rb, line 156
def update_attribute(name, value)
  assign_attributes(name => value)
  save(validate: false)
end
update_attributes(attrs)
Alias for: update
update_attributes!(attrs)
Alias for: update!

Private Instance Methods

coerce_for_persistence(value) click to toggle source
# File lib/modis/persistence.rb, line 179
def coerce_for_persistence(value)
  value = [value.year, value.month, value.day, value.hour, value.min, value.sec, value.strftime("%:z")] if value.is_a?(Time)
  MessagePack.pack(value)
end
coerced_attributes() click to toggle source

rubocop:enable Metrics/AbcSize, Metrics/PerceivedComplexity

# File lib/modis/persistence.rb, line 236
def coerced_attributes
  attrs = []

  if new_record?
    attributes.each do |k, v|
      attrs << k << coerce_for_persistence(v) if (self.class.attributes[k][:default] || nil) != v
    end
  else
    changed_attributes.each_key do |key|
      attrs << key << coerce_for_persistence(attributes[key])
    end
  end

  attrs
end
create_or_update(args = {}) click to toggle source
# File lib/modis/persistence.rb, line 184
def create_or_update(args = {})
  validate(args)
  future = persist

  if future && ((future.is_a?(Symbol) && future == :unchanged) || future.value == 'OK')
    changes_applied
    @new_record = false
    true
  else
    false
  end
end
persist() click to toggle source

rubocop:disable Metrics/AbcSize, Metrics/PerceivedComplexity

# File lib/modis/persistence.rb, line 205
def persist
  future = nil
  set_id if new_record?
  callback = new_record? ? :create : :update

  self.class.transaction do |redis|
    run_callbacks :save do
      run_callbacks callback do
        redis.pipelined do
          attrs = coerced_attributes
          key = self.class.sti_child? ? self.class.sti_base_key_for(id) : self.class.key_for(id)
          future = attrs.any? ? redis.hmset(key, attrs) : :unchanged

          if new_record?
            if self.class.all_index_enabled?
              redis.sadd(self.class.key_for(:all), id)
              redis.sadd(self.class.sti_base_key_for(:all), id) if self.class.sti_child?
            end
            add_to_indexes(redis)
          else
            update_indexes(redis)
          end
        end
      end
    end
  end

  future
end
set_id() click to toggle source
# File lib/modis/persistence.rb, line 252
def set_id
  namespace = self.class.sti_child? ? self.class.sti_base_absolute_namespace : self.class.absolute_namespace
  Modis.with_connection do |redis|
    self.id = redis.incr("#{namespace}_id_seq")
  end
end
validate(args) click to toggle source
# File lib/modis/persistence.rb, line 197
def validate(args)
  skip_validate = args.key?(:validate) && args[:validate] == false
  return if skip_validate || valid?

  raise Modis::RecordInvalid, errors.full_messages.join(', ')
end