diff options
author | Sean Griffin <sean@thoughtbot.com> | 2015-01-25 16:53:46 -0700 |
---|---|---|
committer | Sean Griffin <sean@thoughtbot.com> | 2015-01-25 16:53:46 -0700 |
commit | 2da8f2154b2f4c6beac5e50225742beb3caea996 (patch) | |
tree | f9e66e1b83d3da7c5b634e8b2f8046df9a1b7f0f /activerecord/lib/active_record/relation/where_clause_factory.rb | |
parent | 320600c773a16418fe37eccea2eb1082f58062f7 (diff) | |
download | rails-2da8f2154b2f4c6beac5e50225742beb3caea996.tar.gz rails-2da8f2154b2f4c6beac5e50225742beb3caea996.tar.bz2 rails-2da8f2154b2f4c6beac5e50225742beb3caea996.zip |
Move the construction of `WhereClause` objects out of `Relation`
Yes, I know, I called it a factory so I'm basically the worst person
ever who loves Java and worships the Gang of Four.
Diffstat (limited to 'activerecord/lib/active_record/relation/where_clause_factory.rb')
-rw-r--r-- | activerecord/lib/active_record/relation/where_clause_factory.rb | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/activerecord/lib/active_record/relation/where_clause_factory.rb b/activerecord/lib/active_record/relation/where_clause_factory.rb new file mode 100644 index 0000000000..0430922be3 --- /dev/null +++ b/activerecord/lib/active_record/relation/where_clause_factory.rb @@ -0,0 +1,34 @@ +module ActiveRecord + class Relation + class WhereClauseFactory + def initialize(klass, predicate_builder) + @klass = klass + @predicate_builder = predicate_builder + end + + def build(opts, other) + binds = [] + + case opts + when String, Array + parts = [klass.send(:sanitize_sql, other.empty? ? opts : ([opts] + other))] + when Hash + attributes = predicate_builder.resolve_column_aliases(opts) + attributes = klass.send(:expand_hash_conditions_for_aggregates, attributes) + + attributes, binds = predicate_builder.create_binds(attributes) + + parts = predicate_builder.build_from_hash(attributes) + else + parts = [opts] + end + + WhereClause.new(parts, binds) + end + + protected + + attr_reader :klass, :predicate_builder + end + end +end |