Module: ActiveMatrix::AsyncQuery

Defined in:
lib/active_matrix/async_query.rb

Overview

Helper methods for async ActiveRecord queries (Rails 8.0+)

Class Method Summary collapse

Class Method Details

.async_count(relation) ⇒ Integer

Count records asynchronously

Parameters:

  • relation (ActiveRecord::Relation)

    The relation to count

Returns:

  • (Integer)

    The count



18
19
20
# File 'lib/active_matrix/async_query.rb', line 18

def async_count(relation)
  relation.async_count.value
end

.async_exists?(relation) ⇒ Boolean

Check existence asynchronously

Parameters:

  • relation (ActiveRecord::Relation)

    The relation

Returns:

  • (Boolean)

    Whether records exist



41
42
43
# File 'lib/active_matrix/async_query.rb', line 41

def async_exists?(relation)
  relation.async_count.value.positive?
end

.async_pluck(relation, *columns) ⇒ Array

Pluck columns asynchronously

Parameters:

  • relation (ActiveRecord::Relation)

    The relation

  • columns (Array<Symbol>)

    The columns to pluck

Returns:

  • (Array)

    The plucked values



34
35
36
# File 'lib/active_matrix/async_query.rb', line 34

def async_pluck(relation, *columns)
  relation.async_pluck(*columns).value
end

.async_sum(relation, column) ⇒ Numeric

Sum column asynchronously

Parameters:

  • relation (ActiveRecord::Relation)

    The relation

  • column (Symbol)

    The column to sum

Returns:

  • (Numeric)

    The sum



26
27
28
# File 'lib/active_matrix/async_query.rb', line 26

def async_sum(relation, column)
  relation.async_sum(column).value
end

.load_async(relation) ⇒ Array

Load records asynchronously

Parameters:

  • relation (ActiveRecord::Relation)

    The relation to load

Returns:

  • (Array)

    The loaded records



11
12
13
# File 'lib/active_matrix/async_query.rb', line 11

def load_async(relation)
  relation.load_async.to_a
end

.parallel(**queries) ⇒ Hash<Symbol, Object>

Execute multiple async queries in parallel and wait for all results

Examples:

results = AsyncQuery.parallel(
  agents: -> { MatrixAgent.where(state: :online).load_async },
  count: -> { MatrixAgent.async_count }
)

Parameters:

  • queries (Hash<Symbol, Proc>)

    Named queries to execute

Returns:

  • (Hash<Symbol, Object>)

    Results keyed by query name



53
54
55
56
# File 'lib/active_matrix/async_query.rb', line 53

def parallel(**queries)
  promises = queries.transform_values(&:call)
  promises.transform_values { |result| result.respond_to?(:value) ? result.value : result }
end