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