From 04eb6e1ce607af0100fba8ff6db81a5b7463b58d Mon Sep 17 00:00:00 2001 From: Ari Epstein Date: Fri, 10 Dec 2010 11:50:59 -0500 Subject: [PATCH] Generate valid sql for AssociationReflection with polymorphic aspect through dependent_conditions method. --- activerecord/lib/active_record/reflection.rb | 8 ++++++-- activerecord/test/cases/reflection_test.rb | 12 +++++++++++- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/activerecord/lib/active_record/reflection.rb b/activerecord/lib/active_record/reflection.rb index a07c321..3b24130 100644 --- a/activerecord/lib/active_record/reflection.rb +++ b/activerecord/lib/active_record/reflection.rb @@ -289,8 +289,12 @@ module ActiveRecord def dependent_conditions(record, base_class, extra_conditions) dependent_conditions = [] - dependent_conditions << "#{primary_key_name} = #{record.send(name).send(:owner_quoted_id)}" - dependent_conditions << "#{options[:as]}_type = '#{base_class.name}'" if options[:as] + if options[:as] + dependent_conditions << "#{options[:as]}_id = #{record.send(name).send(:owner_quoted_id)}" + dependent_conditions << "#{options[:as]}_type = '#{base_class.name}'" + else + dependent_conditions << "#{primary_key_name} = #{record.send(name).send(:owner_quoted_id)}" + end dependent_conditions << klass.send(:sanitize_sql, options[:conditions]) if options[:conditions] dependent_conditions << extra_conditions if extra_conditions dependent_conditions = dependent_conditions.collect {|where| "(#{where})" }.join(" AND ") diff --git a/activerecord/test/cases/reflection_test.rb b/activerecord/test/cases/reflection_test.rb index 389ca9e..582b30a 100644 --- a/activerecord/test/cases/reflection_test.rb +++ b/activerecord/test/cases/reflection_test.rb @@ -11,7 +11,7 @@ require 'models/price_estimate' class ReflectionTest < ActiveRecord::TestCase include ActiveRecord::Reflection - fixtures :topics, :customers, :companies, :subscribers, :price_estimates + fixtures :topics, :customers, :companies, :subscribers, :price_estimates, :posts def setup @first = Topic.find(1) @@ -228,6 +228,16 @@ class ReflectionTest < ActiveRecord::TestCase assert !AssociationReflection.new(:has_and_belongs_to_many, :clients, { :autosave => true, :validate => false }, Firm).validate? end + def test_dependent_conditions_on_polymorphic_has_many + post = Post.first + tagging = Tagging.create! :taggable => post + tagging2 = Tagging.create! + reflection = AssociationReflection.new :has_many, :taggings, { :as => :taggable }, Tagging + results = Tagging.where( reflection.dependent_conditions( post, Post, "1=1" ) ).all + assert_equal true, results.include?( tagging ) + assert_equal false, results.include?( tagging2 ) + end + private def assert_reflection(klass, association, options) assert reflection = klass.reflect_on_association(association) -- 1.7.2.3