aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJon Leighton <j@jonathanleighton.com>2010-10-12 17:27:10 +0100
committerJon Leighton <j@jonathanleighton.com>2010-10-12 17:27:10 +0100
commitdc39aceb94fa810f8d7e263c0293f325fbf9a109 (patch)
tree29f60704ab32c613f785ff86b4c4f7a54b265570
parent61073861856110b4a842a4d5e1033698fd52901f (diff)
downloadrails-dc39aceb94fa810f8d7e263c0293f325fbf9a109.tar.gz
rails-dc39aceb94fa810f8d7e263c0293f325fbf9a109.tar.bz2
rails-dc39aceb94fa810f8d7e263c0293f325fbf9a109.zip
Adding test_has_many_through_has_one_with_has_many_through_source_reflection and modifying ThroughAssociationScope to make it work correctly.
-rw-r--r--activerecord/lib/active_record/associations/through_association_scope.rb2
-rw-r--r--activerecord/test/cases/associations/nested_has_many_through_associations_test.rb21
-rw-r--r--activerecord/test/fixtures/member_details.yml5
-rw-r--r--activerecord/test/models/member.rb2
-rw-r--r--activerecord/test/models/member_detail.rb2
5 files changed, 29 insertions, 3 deletions
diff --git a/activerecord/lib/active_record/associations/through_association_scope.rb b/activerecord/lib/active_record/associations/through_association_scope.rb
index 81e29f047b..09f92332cf 100644
--- a/activerecord/lib/active_record/associations/through_association_scope.rb
+++ b/activerecord/lib/active_record/associations/through_association_scope.rb
@@ -73,7 +73,7 @@ module ActiveRecord
case left.macro
when :belongs_to
left_primary_key = left.klass.primary_key
- right_primary_key = right.primary_key_name
+ right_primary_key = left.primary_key_name
when :has_many, :has_one
left_primary_key = left.primary_key_name
right_primary_key = right.klass.primary_key
diff --git a/activerecord/test/cases/associations/nested_has_many_through_associations_test.rb b/activerecord/test/cases/associations/nested_has_many_through_associations_test.rb
index bc0fb8582d..4b5ce6313a 100644
--- a/activerecord/test/cases/associations/nested_has_many_through_associations_test.rb
+++ b/activerecord/test/cases/associations/nested_has_many_through_associations_test.rb
@@ -23,6 +23,7 @@ require 'models/member_detail'
require 'models/member_type'
require 'models/sponsor'
require 'models/club'
+require 'models/organization'
# NOTE: Some of these tests might not really test "nested" HMT associations, as opposed to ones which
# are just one level deep. But it's all the same thing really, as the "nested" code is being
@@ -32,7 +33,7 @@ require 'models/club'
class NestedHasManyThroughAssociationsTest < ActiveRecord::TestCase
fixtures :authors, :books, :posts, :subscriptions, :subscribers, :tags, :taggings,
:people, :readers, :references, :jobs, :ratings, :comments, :members, :member_details,
- :member_types, :sponsors, :clubs
+ :member_types, :sponsors, :clubs, :organizations
# Through associations can either use the has_many or has_one macros.
#
@@ -113,9 +114,25 @@ class NestedHasManyThroughAssociationsTest < ActiveRecord::TestCase
# assert_equal [sponsors(:moustache_club_sponsor_for_groucho)], members.first.nested_sponsors
end
- # TODO: has_many through
+ # has_many through
# Source: has_many through
# Through: has_one
+ def test_has_many_through_has_one_with_has_many_through_source_reflection
+ assert_equal [member_details(:groucho), member_details(:some_other_guy)],
+ members(:groucho).organization_member_details
+
+ members = Member.joins(:organization_member_details).
+ where('member_details.id' => member_details(:groucho).id)
+ assert_equal [members(:groucho), members(:some_other_guy)], members
+
+ members = Member.joins(:organization_member_details).
+ where('member_details.id' => 9)
+ assert members.empty?
+
+ members = Member.includes(:organization_member_details)
+ assert_equal [member_details(:groucho), member_details(:some_other_guy)],
+ members.first.organization_member_details
+ end
# TODO: has_many through
# Source: has_many
diff --git a/activerecord/test/fixtures/member_details.yml b/activerecord/test/fixtures/member_details.yml
index 020932246a..e1fe695a9b 100644
--- a/activerecord/test/fixtures/member_details.yml
+++ b/activerecord/test/fixtures/member_details.yml
@@ -1,3 +1,8 @@
groucho:
id: 1
member_id: 1
+ organization: nsa
+some_other_guy:
+ id: 2
+ member_id: 2
+ organization: nsa
diff --git a/activerecord/test/models/member.rb b/activerecord/test/models/member.rb
index c2dd9efe3b..1113ef3e28 100644
--- a/activerecord/test/models/member.rb
+++ b/activerecord/test/models/member.rb
@@ -15,4 +15,6 @@ class Member < ActiveRecord::Base
has_many :nested_sponsors, :through => :sponsor_club, :source => :sponsor
has_one :nested_sponsor, :through => :sponsor_club, :source => :sponsor
+
+ has_many :organization_member_details, :through => :member_detail
end
diff --git a/activerecord/test/models/member_detail.rb b/activerecord/test/models/member_detail.rb
index 94f59e5794..0f53b69ced 100644
--- a/activerecord/test/models/member_detail.rb
+++ b/activerecord/test/models/member_detail.rb
@@ -2,4 +2,6 @@ class MemberDetail < ActiveRecord::Base
belongs_to :member
belongs_to :organization
has_one :member_type, :through => :member
+
+ has_many :organization_member_details, :through => :organization, :source => :member_details
end