From 9e69c36289ae84a51b2f44acc86f6366359e59ac Mon Sep 17 00:00:00 2001 From: Anselm Helbig Date: Tue, 3 Feb 2009 17:44:15 +0100 Subject: [PATCH] made ActiveRecord::Base::merge_includes merge hashes --- activerecord/lib/active_record/base.rb | 23 +++++++++++++++++++++-- activerecord/test/cases/method_scoping_test.rb | 7 +++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/activerecord/lib/active_record/base.rb b/activerecord/lib/active_record/base.rb index f9168c8..8ca527f 100755 --- a/activerecord/lib/active_record/base.rb +++ b/activerecord/lib/active_record/base.rb @@ -1701,8 +1701,27 @@ module ActiveRecord #:nodoc: end # Merges includes so that the result is a valid +include+ - def merge_includes(first, second) - (safe_to_array(first) + safe_to_array(second)).uniq + def merge_includes(*args) + hash = args.inject({}) do |h, inc| + case inc + when Array + inc.each { |v| h[v] = merge_includes(h[v], nil) } + when Hash + inc.each { |k, v| h[k] = merge_includes(h[k], v) } + when NilClass, FalseClass + else + h[inc.to_sym] ||= [] + end + h + end + result = hash.map { |k, v| + if v.blank? + hash.delete(k) + k + end + }.compact + result << hash unless hash.blank? + result end def merge_joins(*joins) diff --git a/activerecord/test/cases/method_scoping_test.rb b/activerecord/test/cases/method_scoping_test.rb index 71e2ce8..0da0b6f 100644 --- a/activerecord/test/cases/method_scoping_test.rb +++ b/activerecord/test/cases/method_scoping_test.rb @@ -336,6 +336,13 @@ class NestedScopingTest < ActiveRecord::TestCase assert_equal('David', Developer.find(:first).name) end end + + # mixing hash and array include's will merge correctly + Author.with_scope(:find => { :include => [:posts]}) do + Author.with_scope(:find => { :include => { :posts => :comments } }) do + assert_equal [{ :posts => [:comments] }], Author.instance_eval('current_scoped_methods')[:find][:include] + end + end end def test_nested_scoped_find_replace_include -- 1.5.4.3