Skip to content
Simple database repository pattern for ActiveRecord.
Ruby Shell
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.


Gem Version Build Status Maintainability Test Coverage

Welcome to the DatabaseRepository gem! This gem was written to provide an extra layer to your Ruby applications called repositories. Repositories are used to interact with our database - execute all queries. Thanks to them, you don't need to write anymore ActiveRecord code inside your models, controllers, and services - everything is much simpler to maintain!

This gem requires just ActiveRecord, not Rails - feel free to use it without Rails in your Rack applications!


Add this line to your application's Gemfile:

gem 'database_repository'

And then execute:

$ bundle

Or install it yourself as:

$ gem install database_repository

How to create a repository

To create a new repository, you just need to run a Rails generator (if you use Rails):

$ rails generate database_repository:repository your_repository_name

For example:

$ rails generate database_repository:repository user

A new repository will be generated under:

  • app/repositories/user_repository.rb

You can also add the new repository to app/repositories, your class should inherit from DatabaseRepository::Base class, like:

class UserRepository < DatabaseRepository::Base


  • ActiveRecord >= 3.2


If you want to use your repository, you should create a new instance of a repository, then call a method which will return some data:

users_repository =
users = users_repository.all
user = users_repository.find(2)

By default, a repository maps to a model by a repository's name, for example:

  • UserRepository -> User
  • LineItemRepository -> LineItem
  • User::LineItemRepository -> User::LineItem

If you want to change a model, you can redefine a class name:

class UsersRepository < DatabaseRepository::Base
  entity 'Model'

Preimplemented methods:

  • all

calls ActiveRecord Model.all method.

  • build(attributes)

calls ActiveRecord method.

  • find(id)

calls ActiveRecord Model.find(id) method. Raises DatabaseRepository::RecordNotFound if a record is not found.

  • find_by(id)

calls ActiveRecord Model.find_by(id) method.

  • find_or_initialize_by(id)

calls ActiveRecord Model.find_or_initialize_by(id) method.

  • find_or_create_by(attributes)

calls ActiveRecord Model.find_or_create_by(attributes) method.

  • find_or_create_by!(attributes)

calls ActiveRecord Model.find_or_create_by!(attributes) method. Raises DatabaseRepository::RecordInvalid if a record is invalid.

  • first(limit = nil)

calls ActiveRecord Model.first(limit = nil) method.

  • first!

calls ActiveRecord Model.first! method. Raises DatabaseRepository::RecordNotFound if a record is not found.

  • last(limit = nil)

calls ActiveRecord Model.last(limit = nil) method.

  • last!

calls ActiveRecord Model.last! method. Raises DatabaseRepository::RecordNotFound if a record is not found.

  • create(attributes)

calls ActiveRecord Model.create(attributes) method.

  • create!(attributes)

calls ActiveRecord Model.create!(attributes) method. Raises DatabaseRepository::RecordInvalid if a record is invalid.

  • update(id, attributes)

calls ActiveRecord Model.update(id, attributes) method.

  • update!(id, attributes)

calls ActiveRecord Model.update!(id, attributes) method. Raises DatabaseRepository::RecordInvalid if a record is invalid.

  • update_all(attributes)

calls ActiveRecord Model.update_all(attributes) method.

  • delete(id)

calls ActiveRecord Model.delete(id) method.

  • destroy(id)

calls ActiveRecord Model.destoy(id) method.

  • destroy!(id)

calls ActiveRecord Model.destroy!(id) method. Raises DatabaseRepository::RecordNotDestroyed if a record cannot be destroyed.

  • delete_all

calls ActiveRecord Model.delete_all method.

  • destroy_all

calls ActiveRecord Model.destroy_all method.

Your own methods

If you want to add your methods, just write a regular ActiveRecord code, for example:

class UserRepository < DatabaseRepository::Base
  def most_recent_by_name(name:, limit: 5)
    entity.where(name: name).
      order(created_at: :desc).

Then, inside your service, controller or any other class: 'Piotr Jaworski', limit: 10)

Voila! That's all!


  • Add Sequel support


After checking out the repo, run bin/setup to install dependencies. Then, run rake spec to run the tests. You can also run bin/console for an interactive prompt that will allow you to experiment.

To install this gem onto your local machine, run bundle exec rake install. To release a new version, update the version number in version.rb, and then run bundle exec rake release, which will create a git tag for the version, push git commits and tags, and push the .gem file to


Bug reports and pull requests are welcome on GitHub at This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the Contributor Covenant code of conduct.


MIT License. Copyright 2018 Piotr Jaworski -

You can’t perform that action at this time.