diff options
author | Sean Griffin <sean@thoughtbot.com> | 2015-01-25 14:54:18 -0700 |
---|---|---|
committer | Sean Griffin <sean@thoughtbot.com> | 2015-01-25 16:23:01 -0700 |
commit | 2c46d6db4feaf4284415f2fb6ceceb1bb535f278 (patch) | |
tree | da82ab59d7f5a6c82ef69a87f29284e3930e37a2 /activerecord/lib/active_record/attribute_assignment.rb | |
parent | 79f71d35e957772df7454212b3f235423064832a (diff) | |
download | rails-2c46d6db4feaf4284415f2fb6ceceb1bb535f278.tar.gz rails-2c46d6db4feaf4284415f2fb6ceceb1bb535f278.tar.bz2 rails-2c46d6db4feaf4284415f2fb6ceceb1bb535f278.zip |
Introduce `Relation::WhereClause`
The way that bind values are currently stored on Relation is a mess.
They can come from `having`, `where`, or `join`. I'm almost certain that
`having` is actually broken, and calling `where` followed by `having`
followed by `where` will completely scramble the binds.
Joins don't actually add the bind parameters to the relation itself, but
instead add it onto an accessor on the arel AST which is undocumented,
and unused in Arel itself. This means that the bind values must always
be accessed as `relation.arel.bind_values + relation.bind_values`.
Anything that doesn't is likely broken (and tons of bugs have come up
for exactly that reason)
The result is that everything dealing with `Relation` instances has to
know far too much about the internals. The binds are split, combined,
and re-stored in non-obvious ways that makes it difficult to change
anything about the internal representation of `bind_values`, and is
extremely prone to bugs.
So the goal is to move a lot of logic off of `Relation`, and into
separate objects. This is not the same as what is currently done with
`JoinDependency`, as `Relation` knows far too much about its internals,
and vice versa. Instead these objects need to be black boxes that can
have their implementations swapped easily.
The end result will be two classes, `WhereClause` and `JoinClause`
(`having` will just re-use `WhereClause`), and there will be a single
method to access the bind values of a `Relation` which will be
implemented as
```
join_clause.binds + where_clause.binds + having_clause.binds
```
This is the first step towards that refactoring, with the internal
representation of where changed, and an intermediate representation of
`where_values` and `bind_values` to let the refactoring take small
steps. These will be removed shortly.
Diffstat (limited to 'activerecord/lib/active_record/attribute_assignment.rb')
0 files changed, 0 insertions, 0 deletions