README.md in arel_toolkit-0.2.0 vs README.md in arel_toolkit-0.3.0
- old
+ new
@@ -7,10 +7,11 @@
- [![Test Coverage](https://api.codeclimate.com/v1/badges/3ef13d1649a00a98562d/test_coverage)](https://codeclimate.com/github/mvgijssel/arel_toolkit/test_coverage)
- [![Gem Version](https://badge.fury.io/rb/arel_toolkit.svg)](https://badge.fury.io/rb/arel_toolkit)
- [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
- ![](http://ruby-gem-downloads-badge.herokuapp.com/arel_toolkit?type=total)
- ![](http://ruby-gem-downloads-badge.herokuapp.com/arel_toolkit?label=downloads-current-version)
+- [Coverage report](https://mvgijssel.github.io/arel_toolkit/)
## Installation
Add this line to your application's Gemfile:
@@ -26,11 +27,11 @@
$ gem install arel_toolkit
## sql_to_arel
-Convert your (PostgreSQL) SQL into Arel.
+Convert your (PostgreSQL) SQL into an Arel AST.
```ruby
[1] > sql = 'SELECT id FROM users'
=> "SELECT id FROM users;"
[2] > arel = Arel.sql_to_arel(sql)
@@ -39,10 +40,63 @@
=> "SELECT \"id\" FROM \"users\""
```
## Extensions
-Adds some missing Arel nodes and extends the existing visitors.
+Adds missing Arel nodes and extends the existing visitors, [lib/arel/extensions](https://github.com/mvgijssel/arel_toolkit/tree/master/lib/arel/extensions) for a full list.
+
+## Middleware
+
+The middleware sits between ActiveRecord and the database, which allows you to mutate or log queries before they hit the database. Multiple middleware are supported by passing the results from a finished middleware to the next. User defined context will be passed, which can contains things like the `current_user_id`.
+
+### Example
+
+Create an initializer in Rails which loads the Arel::Middleware **after** ActiveRecord:
+
+```ruby
+ActiveSupport.on_load :active_record do
+ Arel::Middleware::Railtie.insert_postgresql
+end
+```
+
+Create some middleware (can be any Ruby object which responds to `call`):
+
+```ruby
+class ReorderMiddleware
+ def self.call(arel, _context)
+ arel.order(Post.arel_table[:id].asc)
+ end
+end
+
+class LoggingMiddleware
+ def self.call(arel, context)
+ puts "User executing query: `#{context[:current_user_id]}`"
+ puts "Original SQL: `#{context[:original_sql]}`"
+ puts "Modified SQL: `#{arel.to_sql}`"
+ arel
+ end
+end
+```
+
+Run a query with middleware applied
+
+```ruby
+[1] > Arel.middleware.apply([ReorderMiddleware, LoggingMiddleware]).context(current_user_id: 1) { Post.all.load }
+User executing query: `1`
+Original SQL: `SELECT "posts".* FROM "posts" ORDER BY "posts"."id" DESC`
+Modified SQL: `SELECT "posts".* FROM "posts" ORDER BY "posts"."id" DESC, "posts"."id" ASC`
+Post Load (4.1ms) SELECT "posts".* FROM "posts" ORDER BY "posts"."id" DESC, "posts"."id" ASC
+=> []
+```
+
+There are more methods available to help with ordering and modifying of the current applied middleware:
+
+- `Arel.middleware.apply([SomeMiddleware]) { ... }`
+- `Arel.middleware.only([OnlyMe]) { ... }`
+- `Arel.middleware.none { ... }`
+- `Arel.middleware.except(RemoveMe) { ... }`
+- `Arel.middleware.insert_before(RunBefore, ThisMiddleware) { ... }`
+- `Arel.middleware.insert_after(RunAfter, ThisMiddleware) { ... }`
## Development
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.