A Ruby implementation of an Event Store based on Active Record
Change: Several UX improvements for displaying events [#1726]
Change: Show timestamps in local timezone when browsing stream [#1723, #1727]
Timezone is detected upon Browser start. There's still an ability to revert display to show timestamps in UTC, using select input in the footer.
Change: RubyEventStore::BatchEnumerator
optimization [#1708, #1711]
Skip fetching the next batch if the previous one was smaller than the specified batch size.
Change: RubyEventStore::ActiveRecord::BatchEnumerator
optimization [#1708, #1711]
Skip fetching the next batch if the previous one was smaller than the specified batch size)
Change: N+1 optimization [#1708, #1710]
Avoiding N+1 without additional query when join clause is used in the base read query.
Change: Calling Specification#from
and Specification#to
won't trigger SQL query to check if given event id exists [067e9b7f712faadc939659224da581b73c607c1f]
Fix: Raise RubyEventStore::EventNotFound
instead of NoMethodError
if the event_id
passed to Specification#from
or Specification#to
does not exist while using InMemoryRepository
[#1673]
ActiveJob::ConfiguredJob
as a valid handler for ActiveJobScheduler
[331c16b61a931669bdc76928dc761648a938a174]Add: Support for ActiveRecord PostGIS adapter in migration generators [#1650, #1668]
Add: Support for ActiveRecord Trilogy adapter in migration generators [#1671]
Add: Foreign keys for data consistency. This prevents manually removing events at database level if they are already linked in any stream [#1646]
For existing Rails app installations use:
bin/rails g rails_event_store_active_record:migration_for_foreign_key_on_event_id
bin/rails db:migrate
For non–Rails applications:
bundle exec rake db:migrations:add_foreign_key_on_event_id
bundle exec rake db:migrate
New installations are no–op.
Fix: Raise RubyEventStore::EventNotFound
instead of ActiveRecord::RecordNotFound
if the event_id
passed to Specification#from
or Specification#to
does not exist [#1673]
in_streams
specifier [#1670, #1672]PreserveTypes
won't break when stored data shape is different than original one. This change also allows using OpenStruct
for data and metadata [3c5d928]OpenStruct
support in JSONClient
[2bed49c]Add: Optional ActiveJobIdOnlyScheduler
that carries only event_id
. The largest benefit of it has constant size in redis as opposed to size dependent on data and metadata. With the scheduler comes the AsyncHandlerJobIdOnly
[#755, 46dedc287ee8fc5a6fa4a53890307494d753c802]
Fix: JSONClient
correctly handles mapper argument. Previously the mapper argument was unusable, as it was always and unconditionally overwritten [77b73380b07a11c4b05f8c7da615f9fef3f4b7c5]
Add: MySQL now supports json column data type for storing data and metadata of events [8e4850b2b66296b636883e22934e8a7fede6e7d6, ]
Fix: streams_of
being slow due to lack of index on event_id
in event_store_events_in_streams
table (e.g. causing laggy event overview in RES Browser) [5c2c367aa7a737cfe35ed6fe80f7ea7990a24903]
When installing RES from scratch, you don't have to do anything, RES setup will generate valid db migrations. If you're running RES in your existing application, please run accordingly:
for a Rails app:
bin/rails g rails_event_store_active_record:migration_for_missing_event_id_index
bin/rails db:migrate
for a non–Rails Ruby app:
bundle exec rake db:migrations:fix_missing_event_id_index
bundle exec rake db:migrate
RubyEventStore::Metadata
requires metadata keys to be symbols.RubyEventStore::Client
now has the InMemoryRepository
as the default repository.
There's no required action. This change is backward compatible.valid_at
.ActiveRecord::Migration
version from 4.2 to the latest.
The schema doesn't change. There's no required action.RailsEventStore::JSONClient
is built on top of RailsEventStore::Client
and supports the same functionality. However, it's optimized to work with the JSONB data type and provides valid configuration for serializing and deserializing events.
To configure this in your project, use:
Rails.configuration.event_store = RailsEventStore::JSONClient.new
You can find more detailed information about configuration in the docs.
The template:
rails_event_store
to your Gemfile
config/initializers/rails_event_store.rb
with sane defaults and exposes the client under Rails.configuration.event_store
/res
url in your application in development environmentTo use the template in an existing Rails application, cd
to the root directory and run the following command
bin/rails app:template LOCATION=https://railseventstore.org/new
If you're starting a new Rails application, run the following command
rails new -m https://railseventstore.org/new APP_NAME
Read more about options that can be specified during the setup, eg. a database that you want to use.