class Legatus::UnitOfWork

Public Class Methods

new() click to toggle source
# File lib/legatus/unit_of_work.rb, line 4
def initialize
  @steps = []
end

Public Instance Methods

commit() click to toggle source
# File lib/legatus/unit_of_work.rb, line 57
def commit
  ActiveRecord::Base.connection.transaction do 
    @steps.all? { |step| step.call }
  end
end
create(*models) click to toggle source
# File lib/legatus/unit_of_work.rb, line 20
def create(*models)
  @steps << lambda do 
    models.all? { |model| self.execute(:create, model) }
  end
end
denormalize(model, schema) click to toggle source
# File lib/legatus/unit_of_work.rb, line 44
def denormalize(model, schema)
  @steps << lambda do 
    schema.each do |field, subschema|
      assoc    = subschema.keys[0]
      aggre    = subschema.values[0].keys[0]
      subfield = subschema.values[0].values[0]

      model[field] = model.send(subschema.keys[0]).send(aggre, subfield)
    end
    model.save
  end
end
destroy(*models) click to toggle source
# File lib/legatus/unit_of_work.rb, line 26
def destroy(*models)
  @steps << lambda do 
    models.all? { |model| self.execute(:destroy, model) }
  end
end
persist(*models) click to toggle source
# File lib/legatus/unit_of_work.rb, line 32
def persist(*models)
  @steps << lambda do 
    models.all? do |model| 
      if model.is_a?(Array)
        model.all? { |elem| self.save_or_destroy(elem) }
      else
        self.save_or_destroy(model)
      end
    end
  end
end
save(*models) click to toggle source
# File lib/legatus/unit_of_work.rb, line 8
def save(*models)
  @steps << lambda do 
    models.all? { |model| self.execute(:save, model) }
  end
end
update(*models) click to toggle source
# File lib/legatus/unit_of_work.rb, line 14
def update(*models)
  @steps << lambda do 
    models.all? { |model| self.execute(:update, model) }
  end
end

Protected Instance Methods

execute(methodname, model) click to toggle source
# File lib/legatus/unit_of_work.rb, line 64
def execute(methodname, model)
  return model.all? { |elem| elem.send(methodname) } if model.is_a?(Array)
  return model.send(methodname)
end
save_or_destroy(model) click to toggle source
# File lib/legatus/unit_of_work.rb, line 69
def save_or_destroy(model)
  return model.destroy if model.marked_for_destruction?
  return model.save
end