diff options
author | Rick Olson <technoweenie@gmail.com> | 2008-03-21 18:09:03 +0000 |
---|---|---|
committer | Rick Olson <technoweenie@gmail.com> | 2008-03-21 18:09:03 +0000 |
commit | 273b21faa911681ed4b6c748676146e0f6eed0a0 (patch) | |
tree | 7454ae8ead82fbe980c9f3630289c672f247b232 /activerecord/test | |
parent | d8f76e66a19435239eec6f65f910133c6059cd60 (diff) | |
download | rails-273b21faa911681ed4b6c748676146e0f6eed0a0.tar.gz rails-273b21faa911681ed4b6c748676146e0f6eed0a0.tar.bz2 rails-273b21faa911681ed4b6c748676146e0f6eed0a0.zip |
Add has_one :through support, finally. Closes #4756 [thechrisoshow]
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@9067 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
Diffstat (limited to 'activerecord/test')
-rw-r--r-- | activerecord/test/cases/associations/join_model_test.rb | 2 | ||||
-rwxr-xr-x | activerecord/test/cases/associations_test.rb | 63 | ||||
-rw-r--r-- | activerecord/test/fixtures/clubs.yml | 6 | ||||
-rw-r--r-- | activerecord/test/fixtures/members.yml | 4 | ||||
-rw-r--r-- | activerecord/test/fixtures/memberships.yml | 20 | ||||
-rw-r--r-- | activerecord/test/fixtures/sponsors.yml | 3 | ||||
-rw-r--r-- | activerecord/test/models/club.rb | 6 | ||||
-rw-r--r-- | activerecord/test/models/member.rb | 9 | ||||
-rw-r--r-- | activerecord/test/models/membership.rb | 9 | ||||
-rw-r--r-- | activerecord/test/models/sponsor.rb | 4 | ||||
-rw-r--r-- | activerecord/test/schema/schema.rb | 21 |
11 files changed, 145 insertions, 2 deletions
diff --git a/activerecord/test/cases/associations/join_model_test.rb b/activerecord/test/cases/associations/join_model_test.rb index 1034cb67e9..3d59b97f70 100644 --- a/activerecord/test/cases/associations/join_model_test.rb +++ b/activerecord/test/cases/associations/join_model_test.rb @@ -631,7 +631,7 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase assert_equal comments.first.post, comments[1].post end end - + private # create dynamic Post models to allow different dependency options def find_post_with_dependency(post_id, association, association_name, dependency) diff --git a/activerecord/test/cases/associations_test.rb b/activerecord/test/cases/associations_test.rb index 50643066b9..768d2b2600 100755 --- a/activerecord/test/cases/associations_test.rb +++ b/activerecord/test/cases/associations_test.rb @@ -20,6 +20,10 @@ require 'models/parrot' require 'models/pirate' require 'models/treasure' require 'models/price_estimate' +require 'models/club' +require 'models/member' +require 'models/membership' +require 'models/sponsor' class AssociationsTest < ActiveRecord::TestCase fixtures :accounts, :companies, :developers, :projects, :developers_projects, @@ -186,7 +190,7 @@ class HasOneAssociationsTest < ActiveRecord::TestCase assert_equal companies(:first_firm).account, Account.find(1) assert_equal Account.find(1).credit_limit, companies(:first_firm).account.credit_limit end - + def test_has_one_cache_nils firm = companies(:another_firm) assert_queries(1) { assert_nil firm.account } @@ -476,6 +480,63 @@ class HasOneAssociationsTest < ActiveRecord::TestCase end +class HasOneThroughAssociationsTest < ActiveRecord::TestCase + fixtures :members, :clubs, :memberships, :sponsors + + def setup + @member = members(:groucho) + end + + def test_has_one_through_with_has_one + assert_equal clubs(:boring_club), @member.club + end + + def test_has_one_through_with_has_many + assert_equal clubs(:moustache_club), @member.favourite_club + end + + def test_creating_association_creates_through_record + new_member = Member.create(:name => "Chris") + new_member.club = Club.create(:name => "LRUG") + assert_not_nil new_member.current_membership + assert_not_nil new_member.club + end + + def test_replace_target_record + new_club = Club.create(:name => "Marx Bros") + @member.club = new_club + @member.reload + assert_equal new_club, @member.club + end + + def test_replacing_target_record_deletes_old_association + assert_no_difference "Membership.count" do + new_club = Club.create(:name => "Bananarama") + @member.club = new_club + @member.reload + end + end + + def test_has_one_through_polymorphic + assert_equal clubs(:moustache_club), @member.sponsor_club + end + + def has_one_through_to_has_many + assert_equal 2, @member.fellow_members.size + end + + def test_has_one_through_eager_loading + members = Member.find(:all, :include => :club) + assert_equal 2, members.size + assert_not_nil assert_no_queries {members[0].club} + end + + def test_has_one_through_eager_loading_through_polymorphic + members = Member.find(:all, :include => :sponsor_club) + assert_equal 2, members.size + assert_not_nil assert_no_queries {members[0].sponsor_club} + end +end class HasManyAssociationsTest < ActiveRecord::TestCase fixtures :accounts, :companies, :developers, :projects, diff --git a/activerecord/test/fixtures/clubs.yml b/activerecord/test/fixtures/clubs.yml new file mode 100644 index 0000000000..1986d28229 --- /dev/null +++ b/activerecord/test/fixtures/clubs.yml @@ -0,0 +1,6 @@ +boring_club: + name: Banana appreciation society +moustache_club: + name: Moustache and Eyebrow Fancier Club +crazy_club: + name: Skull and bones
\ No newline at end of file diff --git a/activerecord/test/fixtures/members.yml b/activerecord/test/fixtures/members.yml new file mode 100644 index 0000000000..67a6cc459a --- /dev/null +++ b/activerecord/test/fixtures/members.yml @@ -0,0 +1,4 @@ +groucho: + name: Groucho Marx +some_other_guy: + name: Englebert Humperdink
\ No newline at end of file diff --git a/activerecord/test/fixtures/memberships.yml b/activerecord/test/fixtures/memberships.yml new file mode 100644 index 0000000000..99fbe46d9b --- /dev/null +++ b/activerecord/test/fixtures/memberships.yml @@ -0,0 +1,20 @@ +membership_of_boring_club: + joined_on: <%= 3.weeks.ago.to_s(:db) %> + club: boring_club + member: groucho + favourite: false + type: CurrentMembership + +membership_of_favourite_club: + joined_on: <%= 3.weeks.ago.to_s(:db) %> + club: moustache_club + member: groucho + favourite: true + type: Membership + +other_guys_membership: + joined_on: <%= 4.weeks.ago.to_s(:db) %> + club: boring_club + member: some_other_guy + favourite: false + type: CurrentMembership diff --git a/activerecord/test/fixtures/sponsors.yml b/activerecord/test/fixtures/sponsors.yml new file mode 100644 index 0000000000..c116df0534 --- /dev/null +++ b/activerecord/test/fixtures/sponsors.yml @@ -0,0 +1,3 @@ +moustache_club_sponsor_for_groucho: + sponsor_club: moustache_club + sponsorable: groucho (Member)
\ No newline at end of file diff --git a/activerecord/test/models/club.rb b/activerecord/test/models/club.rb new file mode 100644 index 0000000000..171445df3e --- /dev/null +++ b/activerecord/test/models/club.rb @@ -0,0 +1,6 @@ +class Club < ActiveRecord::Base + has_many :memberships + has_many :members, :through => :memberships + has_many :current_memberships + has_many :sponsors +end
\ No newline at end of file diff --git a/activerecord/test/models/member.rb b/activerecord/test/models/member.rb new file mode 100644 index 0000000000..688725f200 --- /dev/null +++ b/activerecord/test/models/member.rb @@ -0,0 +1,9 @@ +class Member < ActiveRecord::Base + has_one :current_membership + has_many :memberships + has_many :fellow_members, :through => :club, :source => :members + has_one :club, :through => :current_membership + has_one :favourite_club, :through => :memberships, :conditions => ["memberships.favourite = ?", true], :source => :club + has_one :sponsor, :as => :sponsorable + has_one :sponsor_club, :through => :sponsor +end
\ No newline at end of file diff --git a/activerecord/test/models/membership.rb b/activerecord/test/models/membership.rb new file mode 100644 index 0000000000..905f948c37 --- /dev/null +++ b/activerecord/test/models/membership.rb @@ -0,0 +1,9 @@ +class Membership < ActiveRecord::Base + belongs_to :member + belongs_to :club +end + +class CurrentMembership < Membership + belongs_to :member + belongs_to :club +end diff --git a/activerecord/test/models/sponsor.rb b/activerecord/test/models/sponsor.rb new file mode 100644 index 0000000000..50c2c2d76c --- /dev/null +++ b/activerecord/test/models/sponsor.rb @@ -0,0 +1,4 @@ +class Sponsor < ActiveRecord::Base + belongs_to :sponsor_club, :class_name => "Club", :foreign_key => "club_id" + belongs_to :sponsorable, :polymorphic => true +end
\ No newline at end of file diff --git a/activerecord/test/schema/schema.rb b/activerecord/test/schema/schema.rb index 33aa6e2ea4..724226c359 100644 --- a/activerecord/test/schema/schema.rb +++ b/activerecord/test/schema/schema.rb @@ -49,6 +49,10 @@ ActiveRecord::Schema.define do t.integer :category_id, :null => false t.integer :post_id, :null => false end + + create_table :clubs, :force => true do |t| + t.string :name + end create_table :colnametests, :force => true do |t| t.integer :references, :null => false @@ -117,6 +121,17 @@ ActiveRecord::Schema.define do t.integer :version, :null => false, :default => 0 end + create_table :members, :force => true do |t| + t.string :name + end + + create_table :memberships, :force => true do |t| + t.datetime :joined_on + t.integer :club_id, :member_id + t.boolean :favourite, :default => false + t.string :type + end + create_table :minimalistics, :force => true do |t| end @@ -177,6 +192,12 @@ ActiveRecord::Schema.define do t.integer :post_id, :null => false t.integer :person_id, :null => false end + + create_table :sponsors, :force => true do |t| + t.integer :club_id + t.integer :sponsorable_id + t.integer :sponsorable_type + end create_table :subscribers, :force => true, :id => false do |t| t.string :nick, :null => false |