aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--activerecord/CHANGELOG2
-rwxr-xr-xactiverecord/lib/active_record/associations.rb4
-rw-r--r--activerecord/lib/active_record/associations/has_and_belongs_to_many_association.rb4
-rw-r--r--activerecord/lib/active_record/associations/has_many_association.rb8
-rw-r--r--activerecord/lib/active_record/associations/has_one_association.rb2
-rwxr-xr-xactiverecord/lib/active_record/base.rb4
-rwxr-xr-xactiverecord/test/fixtures_test.rb13
7 files changed, 19 insertions, 18 deletions
diff --git a/activerecord/CHANGELOG b/activerecord/CHANGELOG
index 1958a7ef4e..05743e9f4f 100644
--- a/activerecord/CHANGELOG
+++ b/activerecord/CHANGELOG
@@ -1,5 +1,7 @@
*1.12.1*
+* Always parenthesize :conditions options so they may be safely combined with STI and constraints.
+
* Correct PostgreSQL primary key sequence detection. #2507 [tmornini@infomania.com]
* Added support for using limits in eager loads that involve has_many and has_and_belongs_to_many associations
diff --git a/activerecord/lib/active_record/associations.rb b/activerecord/lib/active_record/associations.rb
index cf015f89db..87080bf0da 100755
--- a/activerecord/lib/active_record/associations.rb
+++ b/activerecord/lib/active_record/associations.rb
@@ -296,8 +296,8 @@ module ActiveRecord
options.assert_valid_keys(
:foreign_key, :class_name, :exclusively_dependent, :dependent,
:conditions, :order, :finder_sql, :counter_sql,
- :before_add, :after_add, :before_remove, :after_remove
- )
+ :before_add, :after_add, :before_remove, :after_remove
+ )
association_name, association_class_name, association_class_primary_key_name =
associate_identification(association_id, options[:class_name], options[:foreign_key])
diff --git a/activerecord/lib/active_record/associations/has_and_belongs_to_many_association.rb b/activerecord/lib/active_record/associations/has_and_belongs_to_many_association.rb
index 04774fa28a..1fab50418a 100644
--- a/activerecord/lib/active_record/associations/has_and_belongs_to_many_association.rb
+++ b/activerecord/lib/active_record/associations/has_and_belongs_to_many_association.rb
@@ -41,7 +41,7 @@ module ActiveRecord
else
conditions = "#{@finder_sql}"
if sanitized_conditions = sanitize_sql(options[:conditions])
- conditions << " AND #{sanitized_conditions}"
+ conditions << " AND (#{sanitized_conditions})"
end
options[:conditions] = conditions
options[:joins] = @join_sql
@@ -141,7 +141,7 @@ module ActiveRecord
@finder_sql = @options[:finder_sql]
else
@finder_sql = "#{@join_table}.#{@association_class_primary_key_name} = #{@owner.quoted_id} "
- @finder_sql << " AND #{interpolate_sql(@options[:conditions])}" if @options[:conditions]
+ @finder_sql << " AND (#{interpolate_sql(@options[:conditions])})" if @options[:conditions]
end
@join_sql = "LEFT JOIN #{@join_table} ON #{@association_class.table_name}.#{@association_class.primary_key} = #{@join_table}.#{@association_foreign_key}"
diff --git a/activerecord/lib/active_record/associations/has_many_association.rb b/activerecord/lib/active_record/associations/has_many_association.rb
index 114f84ed5d..f5f27dc410 100644
--- a/activerecord/lib/active_record/associations/has_many_association.rb
+++ b/activerecord/lib/active_record/associations/has_many_association.rb
@@ -26,7 +26,7 @@ module ActiveRecord
records = @association_class.find_by_sql(@finder_sql)
else
sql = @finder_sql
- sql += " AND #{sanitize_sql(runtime_conditions)}" if runtime_conditions
+ sql += " AND (#{sanitize_sql(runtime_conditions)})" if runtime_conditions
orderings ||= @options[:order]
records = @association_class.find_all(sql, orderings, limit, joins)
end
@@ -45,7 +45,7 @@ module ActiveRecord
@association_class.count_by_sql(@finder_sql)
else
sql = @finder_sql
- sql += " AND #{sanitize_sql(runtime_conditions)}" if runtime_conditions
+ sql += " AND (#{sanitize_sql(runtime_conditions)})" if runtime_conditions
@association_class.count(sql)
end
end
@@ -137,7 +137,7 @@ module ActiveRecord
@finder_sql = interpolate_sql(@options[:finder_sql])
else
@finder_sql = "#{@association_class.table_name}.#{@association_class_primary_key_name} = #{@owner.quoted_id}"
- @finder_sql << " AND #{interpolate_sql(@conditions)}" if @conditions
+ @finder_sql << " AND (#{interpolate_sql(@conditions)})" if @conditions
end
if @options[:counter_sql]
@@ -147,7 +147,7 @@ module ActiveRecord
@counter_sql = interpolate_sql(@options[:counter_sql])
else
@counter_sql = "#{@association_class.table_name}.#{@association_class_primary_key_name} = #{@owner.quoted_id}"
- @counter_sql << " AND #{interpolate_sql(@conditions)}" if @conditions
+ @counter_sql << " AND (#{interpolate_sql(@conditions)})" if @conditions
end
end
end
diff --git a/activerecord/lib/active_record/associations/has_one_association.rb b/activerecord/lib/active_record/associations/has_one_association.rb
index 1ff67ff70a..18f84ee98f 100644
--- a/activerecord/lib/active_record/associations/has_one_association.rb
+++ b/activerecord/lib/active_record/associations/has_one_association.rb
@@ -66,6 +66,8 @@ module ActiveRecord
def construct_sql
@finder_sql = "#{@association_class.table_name}.#{@association_class_primary_key_name} = #{@owner.quoted_id}#{@options[:conditions] ? " AND " + @options[:conditions] : ""}"
+ @finder_sql << " AND (#{sanitize_sql(@options[:conditions])})" if @options[:conditions]
+ @finder_sql
end
end
end
diff --git a/activerecord/lib/active_record/base.rb b/activerecord/lib/active_record/base.rb
index 58f884595c..5d594c61a6 100755
--- a/activerecord/lib/active_record/base.rb
+++ b/activerecord/lib/active_record/base.rb
@@ -893,8 +893,8 @@ module ActiveRecord #:nodoc:
condition_segments = [scope_constraints[:conditions]]
condition_segments << sanitize_sql(conditions) unless conditions.nil?
condition_segments << type_condition unless descends_from_active_record?
- condition_segments.compact!
- sql << "WHERE #{condition_segments.join(" AND ")} " unless condition_segments.empty?
+ condition_segments.compact!
+ sql << "WHERE (#{condition_segments.join(") AND (")}) " unless condition_segments.empty?
end
def type_condition
diff --git a/activerecord/test/fixtures_test.rb b/activerecord/test/fixtures_test.rb
index e3a37b99a3..0e3176725b 100755
--- a/activerecord/test/fixtures_test.rb
+++ b/activerecord/test/fixtures_test.rb
@@ -168,8 +168,12 @@ class FixturesTest < Test::Unit::TestCase
end
end
end
+end
+
+if Account.connection.respond_to?(:reset_pk_sequence!)
+ class FixturesResetPkSequenceTest < Test::Unit::TestCase
+ fixtures :accounts
- if Account.connection.respond_to?(:reset_pk_sequence!)
def test_resets_to_min_pk
Account.delete_all
Account.connection.reset_pk_sequence!(Account.table_name)
@@ -284,11 +288,4 @@ class ForeignKeyFixturesTest < Test::Unit::TestCase
def test_number2
assert true
end
-
end
-
-
-
-
-
-