From ee7f66603573fd441f1522cc73ec0b7f56c4d1af Mon Sep 17 00:00:00 2001 From: Jon Leighton Date: Sat, 14 Jan 2012 17:53:52 +0000 Subject: [PATCH] automatically add references when we can --- .../active_record/relation/predicate_builder.rb | 12 ++++++++++++ .../lib/active_record/relation/query_methods.rb | 4 +++- activerecord/test/cases/relations_test.rb | 14 ++++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/activerecord/lib/active_record/relation/predicate_builder.rb b/activerecord/lib/active_record/relation/predicate_builder.rb index 88081edae2..1d04e763f6 100644 --- a/activerecord/lib/active_record/relation/predicate_builder.rb +++ b/activerecord/lib/active_record/relation/predicate_builder.rb @@ -21,6 +21,18 @@ module ActiveRecord predicates.flatten end + def self.references(attributes) + references = attributes.map do |key, value| + if value.is_a?(Hash) + key + else + key = key.to_s + key.split('.').first.to_sym if key.include?('.') + end + end + references.compact + end + private def self.build(attribute, value) case value diff --git a/activerecord/lib/active_record/relation/query_methods.rb b/activerecord/lib/active_record/relation/query_methods.rb index 7b340c1b64..ef3545c76a 100644 --- a/activerecord/lib/active_record/relation/query_methods.rb +++ b/activerecord/lib/active_record/relation/query_methods.rb @@ -52,7 +52,7 @@ module ActiveRecord return self if args.blank? relation = clone - relation.references_values = (references_values + args).uniq + relation.references_values = (references_values + args).flatten.uniq relation end @@ -151,6 +151,7 @@ module ActiveRecord return self if opts.blank? relation = clone + relation = relation.references(PredicateBuilder.references(opts)) if Hash === opts relation.where_values += build_where(opts, rest) relation end @@ -159,6 +160,7 @@ module ActiveRecord return self if opts.blank? relation = clone + relation = relation.references(PredicateBuilder.references(opts)) if Hash === opts relation.having_values += build_where(opts, rest) relation end diff --git a/activerecord/test/cases/relations_test.rb b/activerecord/test/cases/relations_test.rb index c089ed164c..a652a52f38 100644 --- a/activerecord/test/cases/relations_test.rb +++ b/activerecord/test/cases/relations_test.rb @@ -1175,4 +1175,18 @@ class RelationTest < ActiveRecord::TestCase scope = Post.references(:comments) assert !scope.eager_loading? end + + def test_automatically_added_references + scope = Post.where(:comments => { :body => "Bla" }) + assert_equal [:comments], scope.references_values + + scope = Post.where('comments.body' => 'Bla') + assert_equal [:comments], scope.references_values + + scope = Post.having(:comments => { :body => "Bla" }) + assert_equal [:comments], scope.references_values + + scope = Post.having('comments.body' => 'Bla') + assert_equal [:comments], scope.references_values + end end