module Shamu::Services::ActiveRecord

Helper methods useful for services that interact with {ActiveRecord::Base} models.

Public Instance Methods

with_request( * ) click to toggle source

Override to make sure we always catch ActiveRecord not found errors.

Calls superclass method
# File lib/shamu/services/active_record.rb, line 11
def with_request( * )
  wrap_not_found do
    super
  end
end

Private Instance Methods

build_entity_list( source ) click to toggle source

(see Service#build_entity_list)

Calls superclass method
# File lib/shamu/services/active_record.rb, line 76
def build_entity_list( source )
  if source_paged?( source )
    Shamu::Entities::PagedList.new( source )
  else
    super
  end
end
scope_relation( relation, list_scope ) click to toggle source

@!visibility public

Apply the filters specified in `list_scope` to the `relation`.

@param [ActiveRecord::Relation] relation to filter. @param [Entities::ListScope] list_scope to apply. @return [ActiveRecord::Relation] the scoped relation.

# File lib/shamu/services/active_record.rb, line 58
def scope_relation( relation, list_scope )
  return unless relation

  if relation.respond_to?( :by_list_scope )
    relation.by_list_scope( list_scope )
  else
    fail "Can't scope a #{ relation.klass }. Add `scope :by_list_scope, ->(list_scope) { ... }` or extend Shamu::Entities::ActiveRecord." # rubocop:disable Metrics/LineLength
  end
end
source_paged?( source ) click to toggle source

@param [ActiveRecord::Relation, Enumerable] source @return [Boolean] true if the source supports paging and has paging constraints set.

# File lib/shamu/services/active_record.rb, line 71
def source_paged?( source )
  source.respond_to?( :current_page ) && !!source.current_page
end
with_transaction( options = {} ) { || ... } click to toggle source

@!visibility public

Wrap all the changes to any ActiveRecord resource in a transaction. @param [Hash] options to pass to

ActiveRecord::Transactions.transaction.

@yieldreturn [Result] the validation sources for the transaction. See

{Service#with_result}.

@return [Result]

# File lib/shamu/services/active_record.rb, line 39
def with_transaction( options = {}, &block )
  result = nil

  ::ActiveRecord::Base.transaction options do
    result = yield
    success = result && ( result.respond_to?( :valid? ) ? result.valid? : true )
    raise ::ActiveRecord::Rollback unless success
  end

  result
end
wrap_not_found( ) { || ... } click to toggle source

@!visibility public

Watch for ActiveRecord::RecordNotFound errors and rethrow as a {Shamu::NotFoundError}.

# File lib/shamu/services/active_record.rb, line 25
def wrap_not_found( &block )
  yield
rescue ::ActiveRecord::RecordNotFound
  raise Shamu::NotFoundError
end