Merge pull request #50284 from seanpdoyle/close-49574

Infer `:inverse_of` for `has_many ..., through:`
This commit is contained in:
Jean Boussier 2024-01-21 17:21:49 +01:00 committed by GitHub
commit 1faf89f559
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 15 additions and 2 deletions

View File

@ -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

View File

@ -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"

View File

@ -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)