class Ector::Multi

Constants

Error

Parent class for all Multi errors

Rollback

Parent class for all “Rollback-able” errors

Attributes

failure[R]
operations[R]
results[R]

Public Class Methods

new() click to toggle source
# File lib/ector-multi/multi.rb, line 7
def initialize
  @operations = []
end

Public Instance Methods

append(multi) click to toggle source
# File lib/ector-multi/multi.rb, line 11
def append(multi)
  check_operation_uniqueness!(multi.to_list)

  @operations.push *multi.operations

  self
end
commit() click to toggle source
# File lib/ector-multi/multi.rb, line 55
def commit
  results = {}

  fail_fast = operations.find(&:fail_fast?)
  fail_fast.run(results) if fail_fast

  ::ActiveRecord::Base.transaction(joinable: false, requires_new: true) do
    operations.each do |operation|
      ::ActiveRecord::Base.transaction(joinable: false, requires_new: true) do
        results[operation.name] = operation.run(::OpenStruct.new(results))
      end
    end
  end

  Ector::Multi::Result.new(results)
rescue Ector::Multi::Rollback => error
  Ector::Multi::Result.new(results, error)
end
create(name, model, attributes = {}, &block) click to toggle source
# File lib/ector-multi/multi.rb, line 19
def create(name, model, attributes = {}, &block)
  add_operation Operation::Create.new(name, model, operation_block(attributes, block))
end
destroy(name, object = nil, &block) click to toggle source
# File lib/ector-multi/multi.rb, line 23
def destroy(name, object = nil, &block)
  add_operation Operation::Destroy.new(name, operation_block(object, block))
end
destroy_all(name, dataset = nil, &block) click to toggle source
# File lib/ector-multi/multi.rb, line 27
def destroy_all(name, dataset = nil, &block)
  add_operation Operation::DestroyAll.new(name, operation_block(dataset, block))
end
error(name, value) click to toggle source
# File lib/ector-multi/multi.rb, line 31
def error(name, value)
  add_operation Operation::Error.new(name, operation_block(value, nil))
end
prepend(multi) click to toggle source
# File lib/ector-multi/multi.rb, line 35
def prepend(multi)
  check_operation_uniqueness!(multi.to_list)

  @operations.prepend *multi.operations

  self
end
run(name, &procedure) click to toggle source
# File lib/ector-multi/multi.rb, line 43
def run(name, &procedure)
  add_operation Operation::Lambda.new(name, procedure)
end
to_list() click to toggle source
# File lib/ector-multi/multi.rb, line 74
def to_list
  operations.map(&:name)
end
update(name, object, new_values, &block) click to toggle source
# File lib/ector-multi/multi.rb, line 47
def update(name, object, new_values, &block)
  add_operation Operation::Update.new(name, object, operation_block(new_values, block))
end
update_all(name, dataset, new_values, &block) click to toggle source
# File lib/ector-multi/multi.rb, line 51
def update_all(name, dataset, new_values, &block)
  add_operation Operation::UpdateAll.new(name, dataset, operation_block(new_values, block))
end

Private Instance Methods

add_operation(operation) click to toggle source
# File lib/ector-multi/multi.rb, line 80
def add_operation(operation)
  check_operation_uniqueness!(operation.name)

  @operations << operation

  self
end
check_operation_uniqueness!(names) click to toggle source
# File lib/ector-multi/multi.rb, line 88
def check_operation_uniqueness!(names)
  repeated_names = to_list & Array(names)

  fail UniqueOperationError.new(repeated_names) if repeated_names.any?
end
operation_block(args, block) click to toggle source
# File lib/ector-multi/multi.rb, line 94
def operation_block(args, block)
  if block
    Proc.new { |results| block.(results, args) }
  else
    Proc.new { |_| args }
  end
end