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:
commit
44087d8832
5 changed files with 51 additions and 1 deletions
|
@ -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`.
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue