module Quiver::Adapter::ActiveRecord

Public Class Methods

included(host) click to toggle source
# File lib/quiver/adapter/active_record_helpers.rb, line 12
def self.included(host)
  super

  host.adapter_type(:active_record)
  host.send(:extend, ClassMethods)
end

Public Instance Methods

count() click to toggle source
# File lib/quiver/adapter/active_record_helpers.rb, line 65
def count
  count = default_record_class.count

  Quiver::Adapter::AdapterResult.new(count)
end
create(attributes, transaction) click to toggle source
# File lib/quiver/adapter/active_record_helpers.rb, line 71
def create(attributes, transaction)
  persister = ARecLowLevelCreator.new(self.class, attributes)

  if attributes[:__type__]
    attributes = attributes.merge(
      attributes[:__type__][:name] => attributes[:__type__][:value]
    )

    attributes.delete(:__type__)
  end

  begin
    create_mappings(attributes, persister)
  rescue ::ActiveRecord::ActiveRecordError
    transaction.rollback!
    persister.failed!
  end

  Quiver::Adapter::AdapterResult.new do |errors|
    if persister.success?
      persister.result
    else
      errors << Quiver::Error.new('record', 'not_persisted')
      nil
    end
  end
end
find(primary_key) click to toggle source
# File lib/quiver/adapter/active_record_helpers.rb, line 54
def find(primary_key)
  Quiver::Adapter::AdapterResult.new do |errors|
    if record = base_query.find_by(primary_key_name => primary_key)
      load_additional([record.attributes.symbolize_keys]).first
    else
      errors << Quiver::Mapper::NotFoundError.new('record', 'not_found')
      nil
    end
  end
end
hard_delete(attributes, transaction) click to toggle source
# File lib/quiver/adapter/active_record_helpers.rb, line 127
def hard_delete(attributes, transaction)
  unpersister = ARecLowLevelDeleter.new(self.class, attributes)

  if attributes[:__type__]
    attributes = attributes.merge(
      attributes[:__type__][:name] => attributes[:__type__][:value]
    )

    attributes.delete(:__type__)
  end

  begin
    delete_mappings(attributes, unpersister)
  rescue ::ActiveRecord::ActiveRecordError
    transaction.rollback!
    unpersister.failed!
  end

  Quiver::Adapter::AdapterResult.new do |errors|
    if unpersister.success?
      {}
    else
      errors << Quiver::Error.new('record', 'not_deleted')
      nil
    end
  end
end
query(q={}) click to toggle source
# File lib/quiver/adapter/active_record_helpers.rb, line 155
def query(q={})
  filter_params = q[:filter] || {}
  sort_params = q[:sort] || {}
  pagination_params = q[:page] || {}

  query = filter_klass.new(
    base_query,
    filter_params
  ).filter

  count_query = filter_klass.new(
    base_count_query,
    filter_params
  ).filter

  sort_params.each do |attr, asc|
    order = asc ? 'ASC' : 'DESC'
    query = query.order("#{attr} #{order}")
    count_query = count_query.order("#{attr} #{order}")
  end

  total_count = count_query.count

  if pagination_params['limit'] && pagination_params['limit'] != -1
    query = query.limit(pagination_params['limit'])
  end

  if pagination_params['offset']
    query = query.offset(pagination_params['offset'])
  end

  objects = load_additional(query.map(&:attributes).map(&:symbolize_keys))
  result = Quiver::Adapter::AdapterResult.new(objects)

  if pagination_params.any?
    result.data[:pagination_offset] = pagination_params['offset'] || 0
    result.data[:pagination_limit] = pagination_params['limit'] || -1
    result.data[:total_count] = total_count
  end

  result
end
update(attributes, transaction) click to toggle source
# File lib/quiver/adapter/active_record_helpers.rb, line 99
def update(attributes, transaction)
  persister = ARecLowLevelUpdater.new(self.class, attributes)

  if attributes[:__type__]
    attributes = attributes.merge(
      attributes[:__type__][:name] => attributes[:__type__][:value]
    )

    attributes.delete(:__type__)
  end

  begin
    update_mappings(attributes, persister)
  rescue ::ActiveRecord::ActiveRecordError
    transaction.rollback!
    persister.failed!
  end

  Quiver::Adapter::AdapterResult.new do |errors|
    if persister.success?
      persister.result
    else
      errors << Quiver::Error.new('record', 'not_updated')
      nil
    end
  end
end

Private Instance Methods

base_count_query() click to toggle source
# File lib/quiver/adapter/active_record_helpers.rb, line 223
def base_count_query
  default_record_class.where({})
end
base_query() click to toggle source
# File lib/quiver/adapter/active_record_helpers.rb, line 219
def base_query
  default_record_class.where({})
end
create_mappings(attributes, p) click to toggle source
# File lib/quiver/adapter/active_record_helpers.rb, line 243
def create_mappings(attributes, p)
  mappings(attributes, p)
end
default_record_class() click to toggle source
# File lib/quiver/adapter/active_record_helpers.rb, line 200
def default_record_class
  self.class.record_classes[self.class.use_record_class]
end
delete_mappings(attributes, p) click to toggle source
# File lib/quiver/adapter/active_record_helpers.rb, line 251
def delete_mappings(attributes, p)
  mappings(attributes, p)
end
fetch_and_hydrate(record_klass, primary_key) click to toggle source
# File lib/quiver/adapter/active_record_helpers.rb, line 204
def fetch_and_hydrate(record_klass, primary_key)
  errors = Quiver::ErrorCollection.new

  if record = record_klass.find_by(primary_key_name => primary_key)
    attributes = load_additional([record.attributes]).first

    object = hydrate(attributes)
  else
    errors << Quiver::Mapper::NotFoundError.new('record', 'not_found')
    object = nil
  end

  Quiver::Mapper::MapperResult.new(object, errors)
end
filter_klass() click to toggle source
# File lib/quiver/adapter/active_record_helpers.rb, line 227
def filter_klass
  Quiver::Adapter::ActiveRecordAdapterFilter
end
load_additional(items) click to toggle source
# File lib/quiver/adapter/active_record_helpers.rb, line 231
def load_additional(items)
  items
end
mappings(attributes, p) click to toggle source
# File lib/quiver/adapter/active_record_helpers.rb, line 235
def mappings(attributes, p)
  p.map(
    attributes,
    to: self.class.use_record_class,
    primary: true
  )
end
update_mappings(attributes, p) click to toggle source
# File lib/quiver/adapter/active_record_helpers.rb, line 247
def update_mappings(attributes, p)
  mappings(attributes, p)
end