Skip to content

Commit

Permalink
Merge pull request #17217 from codeodor/fix-17119
Browse files Browse the repository at this point in the history
Ensure HABTM relationships produce valid class names (Fixes #17119)
  • Loading branch information
tenderlove committed Nov 9, 2014
2 parents 47704af + f43f56e commit 049caa9
Show file tree
Hide file tree
Showing 7 changed files with 25 additions and 3 deletions.
2 changes: 1 addition & 1 deletion activerecord/lib/active_record/associations.rb
Original file line number Diff line number Diff line change
Expand Up @@ -1700,7 +1700,7 @@ def destroy_associations
hm_options[:through] = middle_reflection.name
hm_options[:source] = join_model.right_reflection.name

[:before_add, :after_add, :before_remove, :after_remove, :autosave, :validate, :join_table].each do |k|
[:before_add, :after_add, :before_remove, :after_remove, :autosave, :validate, :join_table, :class_name].each do |k|
hm_options[k] = options[k] if options.key? k
end

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ def middle_reflection(join_model)

def middle_options(join_model)
middle_options = {}
middle_options[:class] = join_model
middle_options[:class_name] = "#{lhs_model.name}::#{join_model.name}"
middle_options[:source] = join_model.left_reflection.name
if options.key? :foreign_key
middle_options[:foreign_key] = options[:foreign_key]
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
require "cases/helper"
require 'models/developer'
require 'models/computer'
require 'models/project'
require 'models/company'
require 'models/customer'
Expand Down Expand Up @@ -80,7 +81,7 @@ class SubDeveloper < Developer

class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
fixtures :accounts, :companies, :categories, :posts, :categories_posts, :developers, :projects, :developers_projects,
:parrots, :pirates, :parrots_pirates, :treasures, :price_estimates, :tags, :taggings
:parrots, :pirates, :parrots_pirates, :treasures, :price_estimates, :tags, :taggings, :computers

def setup_data_for_habtm_case
ActiveRecord::Base.connection.execute('delete from countries_treaties')
Expand Down Expand Up @@ -883,4 +884,12 @@ def test_redefine_habtm
child.special_projects << SpecialProject.new("name" => "Special Project")
assert child.save, 'child object should be saved'
end

def test_habtm_with_reflection_using_class_name_and_fixtures
assert_not_nil Developer._reflections['shared_computers']
# Checking the fixture for named association is important here, because it's the only way
# we've been able to reproduce this bug
assert_not_nil File.read(File.expand_path("../../../fixtures/developers.yml", __FILE__)).index("shared_computers")
assert_equal developers(:david).shared_computers.first, computers(:laptop)
end
end
5 changes: 5 additions & 0 deletions activerecord/test/fixtures/computers.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,8 @@ workstation:
system: 'Linux'
developer: 1
extendedWarranty: 1

laptop:
system: 'MacOS 1'
developer: 1
extendedWarranty: 1
1 change: 1 addition & 0 deletions activerecord/test/fixtures/developers.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ david:
id: 1
name: David
salary: 80000
shared_computers: laptop

jamis:
id: 2
Expand Down
2 changes: 2 additions & 0 deletions activerecord/test/models/developer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ def find_most_recent

accepts_nested_attributes_for :projects

has_and_belongs_to_many :shared_computers, class_name: "Computer"

has_and_belongs_to_many :projects_extended_by_name,
-> { extending(DeveloperProjectsAssociationExtension) },
:class_name => "Project",
Expand Down
5 changes: 5 additions & 0 deletions activerecord/test/schema/schema.rb
Original file line number Diff line number Diff line change
Expand Up @@ -228,6 +228,11 @@ def except(adapter_names_to_exclude)
t.integer :extendedWarranty, null: false
end

create_table :computers_developers, id: false, force: true do |t|
t.references :computer
t.references :developer
end

create_table :contracts, force: true do |t|
t.integer :developer_id
t.integer :company_id
Expand Down

0 comments on commit 049caa9

Please sign in to comment.