aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord
diff options
context:
space:
mode:
authorJeremy Kemper <jeremy@bitsweat.net>2007-10-16 08:08:08 +0000
committerJeremy Kemper <jeremy@bitsweat.net>2007-10-16 08:08:08 +0000
commitf575757ca47f2bbce9866e2a1b1f23b629352b92 (patch)
tree26a73b0b63a0421aacc2664998e59dc35400732a /activerecord
parentcfbd790ad3dbb9a5b8ee18b4e386abb412246d9e (diff)
downloadrails-f575757ca47f2bbce9866e2a1b1f23b629352b92.tar.gz
rails-f575757ca47f2bbce9866e2a1b1f23b629352b92.tar.bz2
rails-f575757ca47f2bbce9866e2a1b1f23b629352b92.zip
Qualified column names work in hash conditions, like :conditions => { 'comments.created_at' => ... }. Closes #9733.
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@7943 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
Diffstat (limited to 'activerecord')
-rw-r--r--activerecord/CHANGELOG2
-rwxr-xr-xactiverecord/lib/active_record/base.rb14
-rw-r--r--activerecord/test/finder_test.rb5
3 files changed, 20 insertions, 1 deletions
diff --git a/activerecord/CHANGELOG b/activerecord/CHANGELOG
index 0b174f1e78..c2186022ec 100644
--- a/activerecord/CHANGELOG
+++ b/activerecord/CHANGELOG
@@ -1,5 +1,7 @@
*SVN*
+* Qualified column names work in hash conditions, like :conditions => { 'comments.created_at' => ... }. #9733 [danger]
+
* Fix regression where the association would not construct new finder SQL on save causing bogus queries for "WHERE owner_id = NULL" even after owner was saved. #8713 [Bryan Helmkamp]
* Refactor association create and build so before & after callbacks behave consistently. #8854 [lifofifo, mortent]
diff --git a/activerecord/lib/active_record/base.rb b/activerecord/lib/active_record/base.rb
index 4eb99551cd..47bc8bdb2c 100755
--- a/activerecord/lib/active_record/base.rb
+++ b/activerecord/lib/active_record/base.rb
@@ -1570,9 +1570,21 @@ module ActiveRecord #:nodoc:
# # => "status IS NULL and group_id IN (1,2,3)"
# { :age => 13..18 }
# # => "age BETWEEN 13 AND 18"
+ # { 'other_records.id' => 7 }
+ # # => "`other_records`.`id` = 7"
def sanitize_sql_hash_for_conditions(attrs)
conditions = attrs.map do |attr, value|
- "#{quoted_table_name}.#{connection.quote_column_name(attr)} #{attribute_condition(value)}"
+ attr = attr.to_s
+
+ # Extract table name from qualified attribute names.
+ if attr.include?('.')
+ table_name, attr = attr.split('.', 2)
+ table_name = connection.quote_table_name(table_name)
+ else
+ table_name = quoted_table_name
+ end
+
+ "#{table_name}.#{connection.quote_column_name(attr)} #{attribute_condition(value)}"
end.join(' AND ')
replace_bind_variables(conditions, expand_range_bind_variables(attrs.values))
diff --git a/activerecord/test/finder_test.rb b/activerecord/test/finder_test.rb
index b45aabb1fb..10f5bd554d 100644
--- a/activerecord/test/finder_test.rb
+++ b/activerecord/test/finder_test.rb
@@ -160,6 +160,11 @@ class FinderTest < Test::Unit::TestCase
assert_raises(ActiveRecord::RecordNotFound) { Topic.find(1, :conditions => { :approved => true }) }
end
+ def test_find_on_hash_conditions_with_explicit_table_name
+ assert Topic.find(1, :conditions => { 'topics.approved' => false })
+ assert_raises(ActiveRecord::RecordNotFound) { Topic.find(1, :conditions => { 'topics.approved' => true }) }
+ end
+
def test_find_on_association_proxy_conditions
assert_equal [1, 2, 3, 5, 6, 7, 8, 9, 10], Comment.find_all_by_post_id(authors(:david).posts).map(&:id).sort
end