public
Description: Ruby on Rails
Homepage: http://rubyonrails.org
Clone URL: git://github.com/rails/rails.git
fix assignment to has_one :through associations.

Signed-off-by: Michael Koziarski <michael@koziarski.com>
al2o3cr (author)
Fri Nov 14 22:59:12 -0800 2008
NZKoz (committer)
Sat Nov 15 09:20:39 -0800 2008
commit  d3fd9971093101712e4cc97ccc534631888b673d
tree    5a26a28aeef593529ee7acf952da57ef7f0fe3c7
parent  31be959de746da0b704684e858d1ca69dbf6bf7f
...
8
9
10
11
12
 
 
 
13
14
15
16
17
18
...
8
9
10
 
 
11
12
13
14
 
 
15
16
17
0
@@ -8,11 +8,10 @@ module ActiveRecord
0
         current_object = @owner.send(@reflection.through_reflection.name)
0
         
0
         if current_object
0
-          klass.destroy(current_object)
0
-          @owner.clear_association_cache
0
+          current_object.update_attributes(construct_join_attributes(new_value))
0
+        else
0
+          @owner.send(@reflection.through_reflection.name,  klass.send(:create, construct_join_attributes(new_value)))
0
         end
0
-        
0
-        @owner.send(@reflection.through_reflection.name,  klass.send(:create, construct_join_attributes(new_value)))
0
       end
0
       
0
     private
...
3
4
5
 
 
6
7
8
 
9
10
11
...
120
121
122
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
123
...
3
4
5
6
7
8
9
 
10
11
12
13
...
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
0
@@ -3,9 +3,11 @@ require 'models/club'
0
 require 'models/member'
0
 require 'models/membership'
0
 require 'models/sponsor'
0
+require 'models/organization'
0
+require 'models/member_detail'
0
 
0
 class HasOneThroughAssociationsTest < ActiveRecord::TestCase
0
-  fixtures :members, :clubs, :memberships, :sponsors
0
+  fixtures :members, :clubs, :memberships, :sponsors, :organizations
0
   
0
   def setup
0
     @member = members(:groucho)
0
@@ -120,4 +122,40 @@ class HasOneThroughAssociationsTest < ActiveRecord::TestCase
0
     clubs(:moustache_club).send(:private_method)
0
     @member.club.send(:private_method)
0
   end
0
+
0
+  def test_assigning_to_has_one_through_preserves_decorated_join_record
0
+    @organization = organizations(:nsa)
0
+    assert_difference 'MemberDetail.count', 1 do
0
+      @member_detail = MemberDetail.new(:extra_data => 'Extra')
0
+      @member.member_detail = @member_detail
0
+      @member.organization = @organization
0
+    end
0
+    assert_equal @organization, @member.organization
0
+    assert @organization.members.include?(@member)
0
+    assert_equal 'Extra', @member.member_detail.extra_data
0
+  end
0
+
0
+  def test_reassigning_has_one_through
0
+    @organization = organizations(:nsa)
0
+    @new_organization = organizations(:discordians)
0
+
0
+    assert_difference 'MemberDetail.count', 1 do
0
+      @member_detail = MemberDetail.new(:extra_data => 'Extra')
0
+      @member.member_detail = @member_detail
0
+      @member.organization = @organization
0
+    end
0
+    assert_equal @organization, @member.organization
0
+    assert_equal 'Extra', @member.member_detail.extra_data
0
+    assert @organization.members.include?(@member)
0
+    assert !@new_organization.members.include?(@member)
0
+
0
+    assert_no_difference 'MemberDetail.count' do
0
+      @member.organization = @new_organization
0
+    end
0
+    assert_equal @new_organization, @member.organization
0
+    assert_equal 'Extra', @member.member_detail.extra_data
0
+    assert !@organization.members.include?(@member)
0
+    assert @new_organization.members.include?(@member)
0
+  end
0
+
0
 end
...
6
7
8
 
 
9
10
...
6
7
8
9
10
11
12
0
@@ -6,4 +6,6 @@ class Member < ActiveRecord::Base
0
   has_one :favourite_club, :through => :memberships, :conditions => ["memberships.favourite = ?", true], :source => :club
0
   has_one :sponsor, :as => :sponsorable
0
   has_one :sponsor_club, :through => :sponsor
0
+  has_one :member_detail
0
+  has_one :organization, :through => :member_detail
0
 end
0
\ No newline at end of file
...
197
198
199
 
 
 
 
 
 
200
201
202
...
249
250
251
 
 
 
 
252
253
254
...
197
198
199
200
201
202
203
204
205
206
207
208
...
255
256
257
258
259
260
261
262
263
264
0
@@ -197,6 +197,12 @@ ActiveRecord::Schema.define do
0
     t.string :name
0
   end
0
 
0
+  create_table :member_details, :force => true do |t|
0
+    t.integer :member_id
0
+    t.integer :organization_id
0
+    t.string :extra_data
0
+  end
0
+
0
   create_table :memberships, :force => true do |t|
0
     t.datetime :joined_on
0
     t.integer :club_id, :member_id
0
@@ -249,6 +255,10 @@ ActiveRecord::Schema.define do
0
     t.integer :shipping_customer_id
0
   end
0
 
0
+  create_table :organizations, :force => true do |t|
0
+    t.string :name
0
+  end
0
+
0
   create_table :owners, :primary_key => :owner_id ,:force => true do |t|
0
     t.string :name
0
   end

Comments