Don't perform statement caching for find
when called from a scope
If there is a method defined such as `find_and_do_stuff(id)`, which then gets called on an association, we will perform statement caching and the parent ID will not change on subsequent calls. Fixes #18117
This commit is contained in:
parent
18ae0656f5
commit
fb160f6e7d
@ -131,6 +131,7 @@ def find(*ids)
|
||||
return super if block_given? ||
|
||||
primary_key.nil? ||
|
||||
default_scopes.any? ||
|
||||
current_scope ||
|
||||
columns_hash.include?(inheritance_column) ||
|
||||
ids.first.kind_of?(Array)
|
||||
|
||||
|
@ -15,9 +15,11 @@
|
||||
require 'models/toy'
|
||||
require 'models/matey'
|
||||
require 'models/dog'
|
||||
require 'models/car'
|
||||
require 'models/tyre'
|
||||
|
||||
class FinderTest < ActiveRecord::TestCase
|
||||
fixtures :companies, :topics, :entrants, :developers, :developers_projects, :posts, :comments, :accounts, :authors, :customers, :categories, :categorizations
|
||||
fixtures :companies, :topics, :entrants, :developers, :developers_projects, :posts, :comments, :accounts, :authors, :customers, :categories, :categorizations, :cars
|
||||
|
||||
def test_find_by_id_with_hash
|
||||
assert_raises(ActiveRecord::StatementInvalid) do
|
||||
@ -1101,6 +1103,26 @@ def test_finder_with_offset_string
|
||||
end
|
||||
end
|
||||
|
||||
test "find on a scope does not perform statement caching" do
|
||||
honda = cars(:honda)
|
||||
zyke = cars(:zyke)
|
||||
tyre = honda.tyres.create!
|
||||
tyre2 = zyke.tyres.create!
|
||||
|
||||
assert_equal tyre, honda.tyres.custom_find(tyre.id)
|
||||
assert_equal tyre2, zyke.tyres.custom_find(tyre2.id)
|
||||
end
|
||||
|
||||
test "find_by on a scope does not perform statement caching" do
|
||||
honda = cars(:honda)
|
||||
zyke = cars(:zyke)
|
||||
tyre = honda.tyres.create!
|
||||
tyre2 = zyke.tyres.create!
|
||||
|
||||
assert_equal tyre, honda.tyres.custom_find_by(id: tyre.id)
|
||||
assert_equal tyre2, zyke.tyres.custom_find_by(id: tyre2.id)
|
||||
end
|
||||
|
||||
protected
|
||||
def bind(statement, *vars)
|
||||
if vars.first.is_a?(Hash)
|
||||
|
@ -1,3 +1,11 @@
|
||||
class Tyre < ActiveRecord::Base
|
||||
belongs_to :car
|
||||
|
||||
def self.custom_find(id)
|
||||
find(id)
|
||||
end
|
||||
|
||||
def self.custom_find_by(*args)
|
||||
find_by(*args)
|
||||
end
|
||||
end
|
||||
|
Loading…
Reference in New Issue
Block a user