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
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