From 3c23b71a09c28a7be13090f83161963b56a5088e Mon Sep 17 00:00:00 2001 From: Pratik Naik Date: Fri, 1 Jan 2010 03:14:19 +0530 Subject: Move predicate building to a stand alone PredicateBuilder class --- activerecord/lib/active_record.rb | 1 + .../active_record/relation/predicate_builder.rb | 36 ++++++++++++++++++++++ .../lib/active_record/relation/query_methods.rb | 34 +++----------------- 3 files changed, 41 insertions(+), 30 deletions(-) create mode 100644 activerecord/lib/active_record/relation/predicate_builder.rb (limited to 'activerecord/lib') diff --git a/activerecord/lib/active_record.rb b/activerecord/lib/active_record.rb index a524dc50a1..cf439b0dc0 100644 --- a/activerecord/lib/active_record.rb +++ b/activerecord/lib/active_record.rb @@ -54,6 +54,7 @@ module ActiveRecord autoload :QueryMethods autoload :FinderMethods autoload :CalculationMethods + autoload :PredicateBuilder end autoload :Base diff --git a/activerecord/lib/active_record/relation/predicate_builder.rb b/activerecord/lib/active_record/relation/predicate_builder.rb new file mode 100644 index 0000000000..c85a0510b4 --- /dev/null +++ b/activerecord/lib/active_record/relation/predicate_builder.rb @@ -0,0 +1,36 @@ +module ActiveRecord + class PredicateBuilder + + def initialize(engine) + @engine = engine + end + + def build_from_hash(attributes, default_table) + predicates = attributes.map do |column, value| + arel_table = default_table + + if value.is_a?(Hash) + arel_table = Arel::Table.new(column, @engine) + build_predicate_from_hash(value, arel_table) + else + column = column.to_s + + if column.include?('.') + table_name, column = column.split('.', 2) + arel_table = Arel::Table.new(table_name, @engine) + end + + case value + when Array, Range, ActiveRecord::Associations::AssociationCollection, ActiveRecord::NamedScope::Scope + arel_table[column].in(value) + else + arel_table[column].eq(value) + end + end + end + + predicates.flatten + end + + end +end diff --git a/activerecord/lib/active_record/relation/query_methods.rb b/activerecord/lib/active_record/relation/query_methods.rb index dd097db632..432b33e174 100644 --- a/activerecord/lib/active_record/relation/query_methods.rb +++ b/activerecord/lib/active_record/relation/query_methods.rb @@ -104,11 +104,14 @@ module ActiveRecord def where(*args) return spawn if args.blank? + builder = PredicateBuilder.new(Arel::Sql::Engine.new(@klass)) + conditions = if [String, Array].include?(args.first.class) merged = @klass.send(:merge_conditions, args.size > 1 ? Array.wrap(args) : args.first) Arel::SqlLiteral.new(merged) if merged elsif args.first.is_a?(Hash) - build_predicate_from_hash(args.first) + attributes = @klass.send(:expand_hash_conditions_for_aggregates, args.first) + builder.build_from_hash(attributes, table) else args.first end @@ -130,34 +133,5 @@ module ActiveRecord }.join(',') end - def build_predicate_from_hash(attributes, default_table = self.table) - attributes = @klass.send(:expand_hash_conditions_for_aggregates, attributes) - - predicates = attributes.map do |column, value| - arel_table = default_table - - if value.is_a?(Hash) - arel_table = Arel::Table.new(column, Arel::Sql::Engine.new(@klass)) - build_predicate_from_hash(value, arel_table) - else - column = column.to_s - - if column.include?('.') - table_name, column = column.split('.', 2) - arel_table = Arel::Table.new(table_name, Arel::Sql::Engine.new(@klass)) - end - - case value - when Array, Range, ActiveRecord::Associations::AssociationCollection, ActiveRecord::NamedScope::Scope - arel_table[column].in(value) - else - arel_table[column].eq(value) - end - end - end - - predicates.flatten - end - end end -- cgit v1.2.3