mirror of https://github.com/rails/rails
Merge pull request #50284 from seanpdoyle/close-49574
Infer `:inverse_of` for `has_many ..., through:`
This commit is contained in:
commit
1faf89f559
|
@ -708,9 +708,10 @@ module ActiveRecord
|
|||
def automatic_inverse_of
|
||||
if can_find_inverse_of_automatically?(self)
|
||||
inverse_name = ActiveSupport::Inflector.underscore(options[:as] || active_record.name.demodulize).to_sym
|
||||
plural_inverse_name = ActiveSupport::Inflector.pluralize(inverse_name)
|
||||
|
||||
begin
|
||||
reflection = klass._reflect_on_association(inverse_name)
|
||||
reflection = klass._reflect_on_association(inverse_name) || klass._reflect_on_association(plural_inverse_name)
|
||||
rescue NameError => error
|
||||
raise unless error.name.to_s == class_name
|
||||
|
||||
|
@ -720,7 +721,7 @@ module ActiveRecord
|
|||
end
|
||||
|
||||
if valid_inverse_reflection?(reflection)
|
||||
inverse_name
|
||||
reflection.name
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -8,6 +8,7 @@ require "models/project"
|
|||
require "models/developer"
|
||||
require "models/company"
|
||||
require "models/computer"
|
||||
require "models/contract"
|
||||
require "models/club"
|
||||
require "models/membership"
|
||||
|
||||
|
|
|
@ -24,6 +24,7 @@ require "models/user"
|
|||
require "models/room"
|
||||
require "models/contract"
|
||||
require "models/subscription"
|
||||
require "models/subscriber"
|
||||
require "models/book"
|
||||
require "models/branch"
|
||||
require "models/cpk"
|
||||
|
@ -199,6 +200,16 @@ class AutomaticInverseFindingTests < ActiveRecord::TestCase
|
|||
assert_equal comment.body, rating.comment.body, "Changing the original Comment's body should change the Comment's body on the association"
|
||||
end
|
||||
|
||||
def test_belongs_to_should_find_inverse_has_many_automatically
|
||||
book = Book.create!
|
||||
subscriber = book.subscribers.new nick: "Nickname"
|
||||
|
||||
subscriber.save!
|
||||
|
||||
assert_equal [subscriber], book.reload.subscribers
|
||||
assert_equal 1, book.reload.subscribers.count
|
||||
end
|
||||
|
||||
def test_polymorphic_and_has_many_through_relationships_should_not_have_inverses
|
||||
sponsor_reflection = Sponsor.reflect_on_association(:sponsorable)
|
||||
|
||||
|
|
Loading…
Reference in New Issue