An Active Storage service upload/download plugin that stores files in a PostgreSQL or MySQL database. Experimental support also for MSSQL and SQLite.
Main features:
- attachment data stored in a binary field (or blob);
- all service methods implemented;
- supports Rails 6 and 7.
Useful also with platforms like Heroku (due to their ephemeral file system).
- Setup Active Storage in your Rails application
- Add to your Gemfile
gem 'active_storage_db'
(and execute:bundle
) - Install the gem migrations:
bin/rails active_storage_db:install:migrations
(and execute:bin/rails db:migrate
) - Add to your
config/routes.rb
:mount ActiveStorageDB::Engine => '/active_storage_db'
- Change Active Storage service in config/environments/development.rb to:
config.active_storage.service = :db
- Add to config/storage.yml:
db:
service: DB
To setup a separate database connection for the ActiveStorageDB
migrations and files data:
- Add a different database configuration per environment to
config/database.yml
, e.g:
attachments:
database: attachments
migrations_paths: config/attachments_migrate
# other connection details ...
- Extend the ActiveStorage base record class providing the
connects_to
options (updating config/application.rb / using an initializer for ActiveStorageDB / overriding the base model like in the Rails guide):
# e.g. app/overrides/models/active_storage_db/application_record_override.rb
ActiveStorageDB::ApplicationRecord.class_eval do
connects_to database: { reading: :attachments, writing: :attachments }
end
- Move the ActiveStorageDB migrations to the specified migrations path
- Execute the rails db:migrate task
Some utility tasks are available:
# list attachments ordered by blob id desc (with limit 100):
bin/rails 'asdb:list'
# search attachments by filename (or part of it)
bin/rails 'asdb:search[some_filename]'
# download attachment by blob id (retrieved with list or search tasks) - the second argument is the destination:
bin/rails 'asdb:download[123,/tmp]'
If you use this component just star it. A developer is more motivated to improve a project when there is some interest.
Or consider offering me a coffee, it's a small thing but it is greatly appreciated: about me.
- Author: Mattia Roccoberton
- Inspired by activestorage-database-service project
The gem is available as open source under the terms of the MIT License.