If you want to use repository pattern as your way into the database
- Here you can find the changelog.
Add this line to your application's Gemfile:
gem 'koine-repository'
And then execute:
$ bundle
Or install it yourself as:
$ gem install koine-repository
Given you have a table called articles
with fields:
- id
- body
- title
- published
You can create your entity as follows:
class Article
attr_accessor :id, :body, :title, :published
end
Then you can create a repository class for your articles
class ArticlesRepository < Koine::Repository::Repository
# adds methods find(id), create(entity) and update(entity)
include Koine::Repository::Repository::IdAwareEntity
def published
find_all_by(published: true)
end
end
With repositories nothing is magic. You need to instantiate your classes and give them their dependencies.
Then you can start using your classes. Here is how you manually instantiate your classes:
db_adapter = Sequel.connect(db_string)
articles_storage = ::Koine::Repository::Persistence::Adapter::Sql.new(
db_adapter,
:articles
)
repository = ArticlesRepository.new(articles_adapter)
To make creation of objects easier, you should use factories or some kind of dependency injection solution.
It could be as in the example bellow;
container = ApplicationDependencies.new
container.set(:db_connection) do |di|
Sequel.connect("mysql://root@localhost/some_db")
end
container.set(:articles_persistence) do |di|
Koine::Repository::Persistence::Sql.new(
di.get(:db_connection),
:articles
)
end
container.set(ArticlesRepository) do |di|
repository = ArticlesRepository.new(di.get(:articles_persistence))
repository.hydrator = Koine::Hydrator::Hydrator.new
repository.entity_prototype = Article.new
repository
end
Accessing the repository in your controller:
class ArticlesController < MyBaseController
def index
@articles = repository.published
end
def create
@article = Article.new
set_attributes(@article)
# validate as you wish
repository.create(@article)
redirect_to :articles_path, notice: "Article with id #{@article.id} created"
end
def update
@article = repository.find(params[:id])
set_attributes(@article)
# validate
repository.update(@article)
end
def destroy
@article = repository.find(params[:id])
repository.remove(@article)
end
private
def set_attributes(article)
article.title = params[:title]
article.body = params[:body]
article.published = params[:published]
end
def repository
@repository ||= dependencies.get(ArticlesRepository)
end
end
After checking out the repo, run bin/setup
to install dependencies. Then, 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
to create a git tag for the version, push git commits and tags, and push the .gem
file to rubygems.org.
- Fork it ( https://github.com/mjacobus/koine-repository/fork )
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Add some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create a new Pull Request