/active_repository

An example implementation of repository pattern on top of ActiveRecord

Primary LanguageRubyMIT LicenseMIT

Active Repository

Proof of concept implementation of repository pattern on top of ActiveRecord. Partially compabile with ActiveRecord scopes.

Define repository:

class EventRepository
  include ActiveRepository::Base
  
  # set Active Record model that will be used to perform queries
  adapter Event
   
  scope :actual, -> { where('events.event_close > ?', Time.current) }
  
  scope :published, -> { where(status: 'published') }
  
  scope :actual_and_published, -> { actual.published }
  
  scope :by_name, -> (name) {
    where('name LIKE ?', "%#{name}%") if name.present?
  }
  
  scope :by_city_id, -> (city_id) {
    where(city_id: city_id) if city_id.present?
  }
  
  scope :by_venue_id, -> (venue_id) {
    where(venue_id: venue_id) if venue_id.present?
  }
end

Usage:

# create a repository instance
event_repository = EventRepository.new

# make query
actual_events = event_repository.actual

# queries can be chained together 
actual_events_in_lviv = event_repository.actual.by_city_id(lviv_city.id)