Class: Sequent::Core::Persistors::ActiveRecordPersistor

Inherits:
Object
  • Object
show all
Includes:
Persistor
Defined in:
lib/sequent/core/persistors/active_record_persistor.rb

Overview

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.

Instance Method Summary collapse

Instance Method Details

#commitObject



111
112
113
# File 'lib/sequent/core/persistors/active_record_persistor.rb', line 111

def commit
  # noop
end

#create_or_update_record(record_class, values, created_at = Time.now) {|record| ... } ⇒ Object

Yields:

  • (record)


51
52
53
54
55
56
57
58
59
60
# File 'lib/sequent/core/persistors/active_record_persistor.rb', line 51

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| ... } ⇒ Object

Yields:

  • (record)


40
41
42
43
44
45
# 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) ⇒ Object



47
48
49
# File 'lib/sequent/core/persistors/active_record_persistor.rb', line 47

def create_records(record_class, array_of_value_hashes)
  record_class.unscoped.insert_all!(array_of_value_hashes, returning: false)
end

#delete_all_records(record_class, where_clause) ⇒ Object



70
71
72
# File 'lib/sequent/core/persistors/active_record_persistor.rb', line 70

def delete_all_records(record_class, where_clause)
  record_class.unscoped.where(where_clause).delete_all
end

#delete_record(_, record) ⇒ Object



74
75
76
# File 'lib/sequent/core/persistors/active_record_persistor.rb', line 74

def delete_record(_, record)
  record.destroy
end

#do_with_record(record_class, where_clause) {|record| ... } ⇒ Object

Yields:

  • (record)


89
90
91
92
93
# File 'lib/sequent/core/persistors/active_record_persistor.rb', line 89

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) ⇒ Object



82
83
84
85
86
87
# File 'lib/sequent/core/persistors/active_record_persistor.rb', line 82

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) ⇒ Object



103
104
105
# File 'lib/sequent/core/persistors/active_record_persistor.rb', line 103

def execute_sql(statement)
  Sequent::ApplicationRecord.connection.execute(statement)
end

#find_records(record_class, where_clause) ⇒ Object



95
96
97
# File 'lib/sequent/core/persistors/active_record_persistor.rb', line 95

def find_records(record_class, where_clause)
  record_class.unscoped.where(where_clause)
end

#get_record(record_class, where_clause) ⇒ Object



66
67
68
# File 'lib/sequent/core/persistors/active_record_persistor.rb', line 66

def get_record(record_class, where_clause)
  record_class.unscoped.where(where_clause).first
end

#get_record!(record_class, where_clause) ⇒ Object



62
63
64
# File 'lib/sequent/core/persistors/active_record_persistor.rb', line 62

def get_record!(record_class, where_clause)
  record_class.unscoped.where(where_clause).first!
end

#last_record(record_class, where_clause) ⇒ Object



99
100
101
# File 'lib/sequent/core/persistors/active_record_persistor.rb', line 99

def last_record(record_class, where_clause)
  record_class.unscoped.where(where_clause).last
end

#prepareObject



107
108
109
# File 'lib/sequent/core/persistors/active_record_persistor.rb', line 107

def prepare
  # noop
end

#update_all_records(record_class, where_clause, updates) ⇒ Object



78
79
80
# File 'lib/sequent/core/persistors/active_record_persistor.rb', line 78

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| ... } ⇒ Object

Yields:

  • (record)


21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 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