1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Merge pull request #27133 from rails/reload_singular_associations

Introduce `reload_<association>` reader for singular associations.
This commit is contained in:
Yves Senn 2016-11-22 13:49:09 +01:00 committed by GitHub
commit 44087d8832
5 changed files with 51 additions and 1 deletions

View file

@ -1,3 +1,17 @@
* Introduce `Model#reload_<association>` to bring back the behavior
of `Article.category(true)` where `category` is a singular
association.
The force reloading of the association reader was deprecated in
#20888. Unfortunately the suggested alternative of
`article.reload.category` does not expose the same behavior.
This patch adds a reader method with the prefix `reload_` for
singular associations. This method has the same semantics as
passing true to the association reader used to have.
*Yves Senn*
* Make sure eager loading `ActiveRecord::Associations` also loads
constants defined in `ActiveRecord::Associations::Preloader`.

View file

@ -8,7 +8,16 @@ module ActiveRecord::Associations::Builder # :nodoc:
def self.define_accessors(model, reflection)
super
define_constructors(model.generated_association_methods, reflection.name) if reflection.constructable?
mixin = model.generated_association_methods
name = reflection.name
define_constructors(mixin, name) if reflection.constructable?
mixin.class_eval <<-CODE, __FILE__, __LINE__ + 1
def reload_#{name}
association(:#{name}).force_reload_reader
end
CODE
end
# Defines the (build|create)_association methods for belongs_to or has_one association

View file

@ -30,6 +30,13 @@ module ActiveRecord
record
end
# Implements the reload reader method, e.g. foo.reload_bar for
# Foo.has_one :bar
def force_reload_reader
klass.uncached { reload }
target
end
private
def create_scope

View file

@ -291,6 +291,16 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
assert client.account.new_record?
end
def test_reloading_the_belonging_object
odegy_account = accounts(:odegy_account)
assert_equal "Odegy", odegy_account.firm.name
Company.where(id: odegy_account.firm_id).update_all(name: "ODEGY")
assert_equal "Odegy", odegy_account.firm.name
assert_equal "ODEGY", odegy_account.reload_firm.name
end
def test_natural_assignment_to_nil
client = Client.find(3)
client.firm = nil

View file

@ -326,6 +326,16 @@ class HasOneAssociationsTest < ActiveRecord::TestCase
end
end
def test_reload_association
odegy = companies(:odegy)
assert_equal 53, odegy.account.credit_limit
Account.where(id: odegy.account.id).update_all(credit_limit: 80)
assert_equal 53, odegy.account.credit_limit
assert_equal 80, odegy.reload_account.credit_limit
end
def test_build
firm = Firm.new("name" => "GlobalMegaCorp")
firm.save