aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord
diff options
context:
space:
mode:
authorSean Griffin <sean@seantheprogrammer.com>2015-10-20 15:25:29 -0600
committerSean Griffin <sean@seantheprogrammer.com>2015-10-20 15:25:29 -0600
commit0a6c4019dfebb1c46d8c16c89238a05a6fdc9f1d (patch)
tree04b08b1a07a11f4db329c82cc2229b8decaafe23 /activerecord
parent7b92798d2fee012bf683c513fb3864a9143a6f71 (diff)
parentf798cbd2f36ed8a4b825667016d6975b812a5b9f (diff)
downloadrails-0a6c4019dfebb1c46d8c16c89238a05a6fdc9f1d.tar.gz
rails-0a6c4019dfebb1c46d8c16c89238a05a6fdc9f1d.tar.bz2
rails-0a6c4019dfebb1c46d8c16c89238a05a6fdc9f1d.zip
Merge pull request #20957 from akihiro17/find-by-issue
Fix find_by with association subquery issue
Diffstat (limited to 'activerecord')
-rw-r--r--activerecord/CHANGELOG.md6
-rw-r--r--activerecord/lib/active_record/core.rb2
-rw-r--r--activerecord/test/cases/finder_test.rb6
3 files changed, 13 insertions, 1 deletions
diff --git a/activerecord/CHANGELOG.md b/activerecord/CHANGELOG.md
index ed861dc4d6..0c3c21202f 100644
--- a/activerecord/CHANGELOG.md
+++ b/activerecord/CHANGELOG.md
@@ -1,3 +1,9 @@
+* Don't cache arguments in #find_by if they are an ActiveRecord::Relation
+
+ Fixes #20817
+
+ *Hiroaki Izu*
+
* Qualify column name inserted by `group` in calculation
Giving `group` an unqualified column name now works, even if the relation
diff --git a/activerecord/lib/active_record/core.rb b/activerecord/lib/active_record/core.rb
index db3e9d1d52..142b6e8599 100644
--- a/activerecord/lib/active_record/core.rb
+++ b/activerecord/lib/active_record/core.rb
@@ -177,7 +177,7 @@ module ActiveRecord
hash = args.first
return super if hash.values.any? { |v|
- v.nil? || Array === v || Hash === v
+ v.nil? || Array === v || Hash === v || Relation === v
}
# We can't cache Post.find_by(author: david) ...yet
diff --git a/activerecord/test/cases/finder_test.rb b/activerecord/test/cases/finder_test.rb
index 307b68764e..6686ce012d 100644
--- a/activerecord/test/cases/finder_test.rb
+++ b/activerecord/test/cases/finder_test.rb
@@ -265,6 +265,12 @@ class FinderTest < ActiveRecord::TestCase
assert_equal [Account], accounts.collect(&:class).uniq
end
+ def test_find_by_association_subquery
+ author = authors(:david)
+ assert_equal author.post, Post.find_by(author: Author.where(id: author))
+ assert_equal author.post, Post.find_by(author_id: Author.where(id: author))
+ end
+
def test_take
assert_equal topics(:first), Topic.take
end