diff options
author | Matthew Draper <matthew@trebex.net> | 2017-08-02 20:31:22 +0930 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-08-02 20:31:22 +0930 |
commit | 75436a49843c4a5f27b11bcb6ce4ccbdbb7a5f7a (patch) | |
tree | b8765ff0e7cba8790c806b095535882964d0a13f /activerecord | |
parent | 73f887af620371e1229dc10d809e45335b6f7bba (diff) | |
parent | 0d56480c4b547915f99f3581065e52a48bd98ca1 (diff) | |
download | rails-75436a49843c4a5f27b11bcb6ce4ccbdbb7a5f7a.tar.gz rails-75436a49843c4a5f27b11bcb6ce4ccbdbb7a5f7a.tar.bz2 rails-75436a49843c4a5f27b11bcb6ce4ccbdbb7a5f7a.zip |
Merge pull request #29842 from kamipo/fix_find_by_with_range
Fix `find_by` with range conditions
Diffstat (limited to 'activerecord')
-rw-r--r-- | activerecord/lib/active_record/core.rb | 5 | ||||
-rw-r--r-- | activerecord/lib/active_record/statement_cache.rb | 7 | ||||
-rw-r--r-- | activerecord/test/cases/finder_test.rb | 4 |
3 files changed, 12 insertions, 4 deletions
diff --git a/activerecord/lib/active_record/core.rb b/activerecord/lib/active_record/core.rb index 8b97dbe5bf..cdd3b5114a 100644 --- a/activerecord/lib/active_record/core.rb +++ b/activerecord/lib/active_record/core.rb @@ -168,8 +168,7 @@ module ActiveRecord id = ids.first - return super if id.kind_of?(Array) || - id.is_a?(ActiveRecord::Base) + return super if StatementCache.unsupported_value?(id) key = primary_key @@ -194,7 +193,7 @@ module ActiveRecord hash = args.first return super if !(Hash === hash) || hash.values.any? { |v| - v.nil? || Array === v || Hash === v || Relation === v || Base === v + StatementCache.unsupported_value?(v) } # We can't cache Post.find_by(author: david) ...yet diff --git a/activerecord/lib/active_record/statement_cache.rb b/activerecord/lib/active_record/statement_cache.rb index 64657089b5..2af7d00246 100644 --- a/activerecord/lib/active_record/statement_cache.rb +++ b/activerecord/lib/active_record/statement_cache.rb @@ -108,6 +108,11 @@ module ActiveRecord klass.find_by_sql(sql, bind_values, preparable: true, &block) end - alias :call :execute + + def self.unsupported_value?(value) + case value + when NilClass, Array, Range, Hash, Relation, Base then true + end + end end end diff --git a/activerecord/test/cases/finder_test.rb b/activerecord/test/cases/finder_test.rb index 0b4dce37cc..a0d87dfb90 100644 --- a/activerecord/test/cases/finder_test.rb +++ b/activerecord/test/cases/finder_test.rb @@ -1179,6 +1179,10 @@ class FinderTest < ActiveRecord::TestCase assert_equal posts(:eager_other), Post.find_by("id = ?", posts(:eager_other).id) end + test "find_by with range conditions returns the first matching record" do + assert_equal posts(:eager_other), Post.find_by(id: posts(:eager_other).id...posts(:misc_by_bob).id) + end + test "find_by returns nil if the record is missing" do assert_nil Post.find_by("1 = 0") end |