module PopulateMe::DocumentMixins::Callbacks

Public Class Methods

included(base) click to toggle source
# File lib/populate_me/document_mixins/callbacks.rb, line 76
def self.included(base)
  base.extend(ClassMethods)
  base.class_eval do
    [:save,:create,:update,:delete].each do |cb|
      before cb, :recurse_callback
      after cb, :recurse_callback
    end
    before :create, :ensure_id
    before :create, :ensure_position
    after :create, :ensure_not_new
    after :save, :snapshot
    before :delete, :ensure_delete_related
    before :delete, :ensure_delete_attachments
    after :delete, :ensure_new
  end
end

Public Instance Methods

ensure_delete_attachments() click to toggle source
# File lib/populate_me/document_mixins/callbacks.rb, line 66
def ensure_delete_attachments
  self.class.fields.each do |k,v|
    if v[:type]==:attachment
      self.attachment(k).delete_all
    end
  end
end
ensure_id() click to toggle source
# File lib/populate_me/document_mixins/callbacks.rb, line 27
def ensure_id
  if self.id.nil?
    self.id = SecureRandom.hex
  end
  self
end
ensure_new() click to toggle source
# File lib/populate_me/document_mixins/callbacks.rb, line 74
def ensure_new; self._is_new = true; end
ensure_not_new() click to toggle source
# File lib/populate_me/document_mixins/callbacks.rb, line 34
def ensure_not_new; self._is_new = false; end
ensure_position() click to toggle source
# File lib/populate_me/document_mixins/callbacks.rb, line 36
def ensure_position
  self.class.fields.each do |k,v|
    if v[:type]==:position
      return unless self.__send__(k).nil?
      values = if v[:scope].nil?
        self.class.admin_distinct k
      else
        self.class.admin_distinct(k, query: {
          v[:scope] => self.__send__(v[:scope])
        })
      end
      val = values.empty? ? 0 : (values.max + 1)
      self.set k => val
    end
  end
  self
end
exec_callback(name) click to toggle source
# File lib/populate_me/document_mixins/callbacks.rb, line 7
def exec_callback name
  name = name.to_sym
  return self if self.class.callbacks[name].nil?
  self.class.callbacks[name].each do |job|
    if job.respond_to?(:call)
      self.instance_exec name, &job
    else
      meth = self.method(job)
      meth.arity==1 ? meth.call(name) : meth.call
    end
  end
  self
end
recurse_callback(name) click to toggle source
# File lib/populate_me/document_mixins/callbacks.rb, line 21
def recurse_callback name
  nested_docs.each do |d|
    d.exec_callback name
  end
end