class Sequent::Core::Persistors::ActiveRecordPersistor

The ActiveRecordPersistor uses ActiveRecord to update the projection

This is the default persistor in Sequent, but when your event store is growing it is not the best choice as persistor while rebuilding a projection when migrating to a new version of that projection.

Please see the ReplayOptimizedPostgresPersistor as alternative for migrating projections to a new version.

Public Instance Methods

commit() click to toggle source
# File lib/sequent/core/persistors/active_record_persistor.rb, line 124
def commit
  # noop
end
create_or_update_record(record_class, values, created_at = Time.now) { |record| ... } click to toggle source
# File lib/sequent/core/persistors/active_record_persistor.rb, line 64
def create_or_update_record(record_class, values, created_at = Time.now)
  record = get_record(record_class, values)
  unless record
    record = new_record(record_class, values)
    record.created_at = created_at if record.respond_to?(:created_at)
  end
  yield record
  record.save!
  record
end
create_record(record_class, values) { |record| ... } click to toggle source
# File lib/sequent/core/persistors/active_record_persistor.rb, line 40
def create_record(record_class, values)
  record = new_record(record_class, values)
  yield record if block_given?
  record.save!
  record
end
create_records(record_class, array_of_value_hashes) click to toggle source
# File lib/sequent/core/persistors/active_record_persistor.rb, line 47
def create_records(record_class, array_of_value_hashes)
  table = record_class.arel_table

  query = array_of_value_hashes.map do |values|
    insert_manager = new_insert_manager
    insert_manager.into(table)
    insert_manager.insert(
      values.map do |key, value|
        convert_to_values(key, table, value)
      end,
    )
    insert_manager.to_sql
  end.join(';')

  execute_sql(query)
end
delete_all_records(record_class, where_clause) click to toggle source
# File lib/sequent/core/persistors/active_record_persistor.rb, line 83
def delete_all_records(record_class, where_clause)
  record_class.unscoped.where(where_clause).delete_all
end
delete_record(_, record) click to toggle source
# File lib/sequent/core/persistors/active_record_persistor.rb, line 87
def delete_record(_, record)
  record.destroy
end
do_with_record(record_class, where_clause) { |record| ... } click to toggle source
# File lib/sequent/core/persistors/active_record_persistor.rb, line 102
def do_with_record(record_class, where_clause)
  record = record_class.unscoped.where(where_clause).first!
  yield record
  record.save!
end
do_with_records(record_class, where_clause) { |record| ... } click to toggle source
# File lib/sequent/core/persistors/active_record_persistor.rb, line 95
def do_with_records(record_class, where_clause)
  record_class.unscoped.where(where_clause).each do |record|
    yield record
    record.save!
  end
end
execute_sql(statement) click to toggle source
# File lib/sequent/core/persistors/active_record_persistor.rb, line 116
def execute_sql(statement)
  Sequent::ApplicationRecord.connection.execute(statement)
end
find_records(record_class, where_clause) click to toggle source
# File lib/sequent/core/persistors/active_record_persistor.rb, line 108
def find_records(record_class, where_clause)
  record_class.unscoped.where(where_clause)
end
get_record(record_class, where_clause) click to toggle source
# File lib/sequent/core/persistors/active_record_persistor.rb, line 79
def get_record(record_class, where_clause)
  record_class.unscoped.where(where_clause).first
end
get_record!(record_class, where_clause) click to toggle source
# File lib/sequent/core/persistors/active_record_persistor.rb, line 75
def get_record!(record_class, where_clause)
  record_class.unscoped.where(where_clause).first!
end
last_record(record_class, where_clause) click to toggle source
# File lib/sequent/core/persistors/active_record_persistor.rb, line 112
def last_record(record_class, where_clause)
  record_class.unscoped.where(where_clause).last
end
prepare() click to toggle source
# File lib/sequent/core/persistors/active_record_persistor.rb, line 120
def prepare
  # noop
end
update_all_records(record_class, where_clause, updates) click to toggle source
# File lib/sequent/core/persistors/active_record_persistor.rb, line 91
def update_all_records(record_class, where_clause, updates)
  record_class.unscoped.where(where_clause).update_all(updates)
end
update_record(record_class, event, where_clause = {aggregate_id: event.aggregate_id}, options = {}) { |record| ... } click to toggle source
# File lib/sequent/core/persistors/active_record_persistor.rb, line 21
        def update_record(record_class, event, where_clause = {aggregate_id: event.aggregate_id}, options = {})
          record = record_class.unscoped.where(where_clause).first
          unless record
            fail(<<~EOS)
              Record of class #{record_class} with where clause #{where_clause} not found while handling event #{event}
            EOS
          end

          record.updated_at = event.created_at if record.respond_to?(:updated_at)
          yield record if block_given?
          update_sequence_number = if options.key?(:update_sequence_number)
                                     options[:update_sequence_number]
                                   else
                                     record.respond_to?(:sequence_number=)
                                   end
          record.sequence_number = event.sequence_number if update_sequence_number
          record.save!
        end

Private Instance Methods

convert_to_values(key, table, value) click to toggle source
# File lib/sequent/core/persistors/active_record_persistor.rb, line 138
def convert_to_values(key, table, value)
  [table[key], table.type_cast_for_database(key, value)]
end
new_insert_manager() click to toggle source
# File lib/sequent/core/persistors/active_record_persistor.rb, line 134
def new_insert_manager
  Arel::InsertManager.new
end
new_record(record_class, values) click to toggle source
# File lib/sequent/core/persistors/active_record_persistor.rb, line 130
def new_record(record_class, values)
  record_class.unscoped.new(values)
end