Dao::Repository
Installation
Add this line to your application's Gemfile:
gem 'dao-repository'And then execute:
$ bundle
Or install it yourself as:
$ gem install dao-repository
Built-in methods
Repositories in dao-rb are objects that allow you map your data into entities and save them through data gateway.
Basic methods of each repository:
-
Repository.allshould return all data. -
Repository.findshould find entity with given id. You can return entity with its relations by adding a list of them into the second argument (Repository.find(1, with: [:author, :comments])), but your gateway should support eager loading. If entity was not found then method will raise an exception. -
Repository.find_by_idalso should find entity with given id, but if it was not found then method returnnil. -
Repository.lastshould return last entity. You can return entity with its relations by adding a list of them into the first argument (Repository.last(with: [:author, :comments])), but your gateway should support eager loading. -
Repository.countshould return count of entities. -
Repository.buildshould build entity from data object. -
Repository.saveshould save changes in entity. -
Repository.save_allshould save collection of entities. -
Repository.deleteshould delete entity. -
Repository.delete_by_idshould delete entity by id. -
Repository.with_transaction(&block)execute block in transaction if gateway support it. -
Repository.with_lock(id, *args, &block)in transaction: locks (with given arguments) db record with given id, execute block if gateway support it. -
Repository.by_criteriashould return entities by given criteria. -
Repository.by_criteria_countshould return count of elements by given criteria.
Usage example
require 'dao/entity'
require 'dao/repository'
require 'dao/gateway/active_record'
class Comment < ApplicationRecord
end
class Post < ApplicationRecord
has_many :comments
end
class CommentEntity < Dao::Entity::Base
attribute :body, String
end
class PostEntity < Dao::Entity::Base
attribute :id, Integer
attribute :body, String
attribute :comments, Array[CommentEntity]
end
class PostRepository < Dao::Repository::Base
entity PostEntity
gateway Dao::Gateway::ActiveRecord::Base, Post, Dao::Gateway::ActiveRecord::BaseTransformer
end
post = PostRepository.last(with: :comments)
post.id # => 1
post.body # => "Post body"
post.comments # => [#<CommentEntity:0x007ffdcb923a30>]Custom methods
You can define custom methods in your repository:
class Post < ApplicationRecord
has_many :comments
scope :deleted, -> { where(deleted: true) }
end
class PostRepository < Dao::Repository::Base
entity PostEntity
gateway Dao::Gateway::ActiveRecord::Base, Post, Dao::Gateway::ActiveRecord::BaseTransformer
def self.deleted
scope.deleted(with: :comments).apply # it will return deleted posts with loaded comments.
end
endDevelopment
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 rubygems.org.
Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/dao-rb/dao-repository.
License
The gem is available as open source under the terms of the MIT License.