diff options
author | Rick Olson <technoweenie@gmail.com> | 2006-10-11 14:02:24 +0000 |
---|---|---|
committer | Rick Olson <technoweenie@gmail.com> | 2006-10-11 14:02:24 +0000 |
commit | 787049467341a75de469b58bcfe84f0959a2c3af (patch) | |
tree | 01f177b9d0f9a2cb37cb07e008aa2a56861d6ee3 | |
parent | 214d236e7d9967a887fecee6e24d4c96c4a344dc (diff) | |
download | rails-787049467341a75de469b58bcfe84f0959a2c3af.tar.gz rails-787049467341a75de469b58bcfe84f0959a2c3af.tar.bz2 rails-787049467341a75de469b58bcfe84f0959a2c3af.zip |
Restore eager condition interpolation, document it's differences [Rick]
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@5284 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
-rw-r--r-- | activerecord/CHANGELOG | 2 | ||||
-rwxr-xr-x | activerecord/lib/active_record/associations.rb | 10 | ||||
-rw-r--r-- | activerecord/test/associations/join_model_test.rb | 7 | ||||
-rwxr-xr-x | activerecord/test/associations_test.rb | 2 |
4 files changed, 17 insertions, 4 deletions
diff --git a/activerecord/CHANGELOG b/activerecord/CHANGELOG index 7a71eb3ac9..14fc21778a 100644 --- a/activerecord/CHANGELOG +++ b/activerecord/CHANGELOG @@ -1,5 +1,7 @@ *SVN* +* Restore eager condition interpolation, document it's differences [Rick] + * Don't rollback in teardown unless a transaction was started. Don't start a transaction in create_fixtures if a transaction is started. #6282 [Jacob Fugal, Jeremy Kemper] * Add #delete support to has_many :through associations. Closes #6049 [Martin Landers] diff --git a/activerecord/lib/active_record/associations.rb b/activerecord/lib/active_record/associations.rb index 6f70830295..e075ecaf3c 100755 --- a/activerecord/lib/active_record/associations.rb +++ b/activerecord/lib/active_record/associations.rb @@ -358,8 +358,8 @@ module ActiveRecord # as there is currently not any way to disambiguate them. Eager loading will not pull additional attributes on join tables, so "rich # associations" with has_and_belongs_to_many are not a good fit for eager loading. # - # When eager loaded, conditions are not interpolated. This is because the interpolation of lazy loaded conditions happens within the context - # of the object; when eager loading the object does not exist yet. + # When eager loaded, conditions are interpolated in the context of the model class, not the model instance. Conditions are lazily interpolated + # before the actual model exists. # # == Table Aliasing # @@ -1560,7 +1560,7 @@ module ActiveRecord aliased_table_name, reflection.active_record.connection.quote_column_name(reflection.active_record.inheritance_column), klass.quote_value(klass.name.demodulize)] unless klass.descends_from_active_record? - join << "AND #{sanitize_sql(reflection.options[:conditions])} " if reflection.options[:conditions] + join << "AND #{interpolate_sql(sanitize_sql(reflection.options[:conditions]))} " if reflection.options[:conditions] join end @@ -1576,6 +1576,10 @@ module ActiveRecord def table_name_and_alias table_alias_for table_name, @aliased_table_name end + + def interpolate_sql(sql) + instance_eval("%@#{sql.gsub('@', '\@')}@") + end end end end diff --git a/activerecord/test/associations/join_model_test.rb b/activerecord/test/associations/join_model_test.rb index 7b77765d7a..2c7902a695 100644 --- a/activerecord/test/associations/join_model_test.rb +++ b/activerecord/test/associations/join_model_test.rb @@ -351,6 +351,13 @@ class AssociationsJoinModelTest < Test::Unit::TestCase assert_equal [1,2,3,5,6,7,8,9,10], author.comments.collect(&:id) end end + + def test_eager_load_has_many_through_has_many_with_conditions + post = Post.find(:first, :include => :invalid_tags) + assert_no_queries do + post.invalid_tags + end + end def test_eager_belongs_to_and_has_one_not_singularized assert_nothing_raised do diff --git a/activerecord/test/associations_test.rb b/activerecord/test/associations_test.rb index 350799e306..e67880681c 100755 --- a/activerecord/test/associations_test.rb +++ b/activerecord/test/associations_test.rb @@ -315,7 +315,7 @@ class HasOneAssociationsTest < Test::Unit::TestCase assert_equal a, firm.account assert_equal a, firm.account(true) end - + def test_finding_with_interpolated_condition firm = Firm.find(:first) superior = firm.clients.create(:name => 'SuperiorCo') |