Skip to content

Commit

Permalink
Fix preloading of has_one :through associations on belongs_to [#1507
Browse files Browse the repository at this point in the history
…state:resolved]

Signed-off-by: Frederick Cheung <frederick.cheung@gmail.com>
  • Loading branch information
al2o3cr authored and lifo committed Dec 18, 2008
1 parent 8326b95 commit a9422cc
Show file tree
Hide file tree
Showing 9 changed files with 52 additions and 6 deletions.
15 changes: 12 additions & 3 deletions activerecord/lib/active_record/association_preload.rb
Expand Up @@ -204,9 +204,18 @@ def preload_has_one_association(records, reflection, preload_options={})
unless through_records.empty?
source = reflection.source_reflection.name
through_records.first.class.preload_associations(through_records, source)
through_records.each do |through_record|
add_preloaded_record_to_collection(id_to_record_map[through_record[through_primary_key].to_s],
reflection.name, through_record.send(source))
if through_reflection.macro == :belongs_to
rev_id_to_record_map, rev_ids = construct_id_map(records, through_primary_key)
rev_primary_key = through_reflection.klass.primary_key
through_records.each do |through_record|
add_preloaded_record_to_collection(rev_id_to_record_map[through_record[rev_primary_key].to_s],
reflection.name, through_record.send(source))
end
else
through_records.each do |through_record|
add_preloaded_record_to_collection(id_to_record_map[through_record[through_primary_key].to_s],
reflection.name, through_record.send(source))
end
end
end
else
Expand Down
Expand Up @@ -83,7 +83,11 @@ def last(*args)

def to_ary
load_target
@target.to_ary
if @target.is_a?(Array)
@target.to_ary
else
Array(@target)
end
end

def reset
Expand Down
@@ -1,13 +1,14 @@
require "cases/helper"
require 'models/club'
require 'models/member_type'
require 'models/member'
require 'models/membership'
require 'models/sponsor'
require 'models/organization'
require 'models/member_detail'

class HasOneThroughAssociationsTest < ActiveRecord::TestCase
fixtures :members, :clubs, :memberships, :sponsors, :organizations
fixtures :member_types, :members, :clubs, :memberships, :sponsors, :organizations

def setup
@member = members(:groucho)
Expand Down Expand Up @@ -158,4 +159,18 @@ def test_reassigning_has_one_through
assert @new_organization.members.include?(@member)
end

def test_preloading_has_one_through_on_belongs_to
assert_not_nil @member.member_type
@organization = organizations(:nsa)
@member_detail = MemberDetail.new
@member.member_detail = @member_detail
@member.organization = @organization
@member_details = assert_queries(3) do
MemberDetail.find(:all, :include => :member_type)
end
@new_detail = @member_details[0]
assert @new_detail.loaded_member_type?
assert_not_nil assert_no_queries { @new_detail.member_type }
end

end
6 changes: 6 additions & 0 deletions activerecord/test/fixtures/member_types.yml
@@ -0,0 +1,6 @@
founding:
id: 1
name: Founding
provisional:
id: 2
name: Provisional
4 changes: 3 additions & 1 deletion activerecord/test/fixtures/members.yml
@@ -1,4 +1,6 @@
groucho:
name: Groucho Marx
member_type_id: 1
some_other_guy:
name: Englebert Humperdink
name: Englebert Humperdink
member_type_id: 2
1 change: 1 addition & 0 deletions activerecord/test/models/member.rb
Expand Up @@ -8,4 +8,5 @@ class Member < ActiveRecord::Base
has_one :sponsor_club, :through => :sponsor
has_one :member_detail
has_one :organization, :through => :member_detail
belongs_to :member_type
end
1 change: 1 addition & 0 deletions activerecord/test/models/member_detail.rb
@@ -1,4 +1,5 @@
class MemberDetail < ActiveRecord::Base
belongs_to :member
belongs_to :organization
has_one :member_type, :through => :member
end
3 changes: 3 additions & 0 deletions activerecord/test/models/member_type.rb
@@ -0,0 +1,3 @@
class MemberType < ActiveRecord::Base
has_many :members
end
5 changes: 5 additions & 0 deletions activerecord/test/schema/schema.rb
Expand Up @@ -195,6 +195,7 @@ def create_table(*args, &block)

create_table :members, :force => true do |t|
t.string :name
t.integer :member_type_id
end

create_table :member_details, :force => true do |t|
Expand All @@ -210,6 +211,10 @@ def create_table(*args, &block)
t.string :type
end

create_table :member_types, :force => true do |t|
t.string :name
end

create_table :references, :force => true do |t|
t.integer :person_id
t.integer :job_id
Expand Down

0 comments on commit a9422cc

Please sign in to comment.