module Shamu::Services::ActiveRecord
Helper methods useful for services that interact with {ActiveRecord::Base} models.
Public Instance Methods
Override to make sure we always catch ActiveRecord
not found errors.
# File lib/shamu/services/active_record.rb, line 11 def with_request( * ) wrap_not_found do super end end
Private Instance Methods
(see Service#build_entity_list
)
# 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
@!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
@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
@!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
@!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