public
Description: Ruby on Rails
Homepage: http://rubyonrails.org
Clone URL: git://github.com/rails/rails.git
Fixed AssociationsPreload such that it doesnt require foreign keys to be 
integers (fcheung) [#33 state:resolved]
dhh (author)
Wed Apr 30 21:30:50 -0700 2008
commit  6f20efdaf733db26fbf337da73121983785064d5
tree    18dbb4c1dde8b2862df67502d1a9b8ca224d5fc3
parent  1eb686a0e5944d99d40bc8ab8039e4179ed78cf7
...
59
60
61
62
 
63
64
65
66
67
68
69
 
70
71
72
...
78
79
80
81
 
82
83
84
...
115
116
117
118
 
119
120
121
...
140
141
142
143
 
144
145
146
...
195
196
197
198
199
200
201
 
 
 
 
 
202
203
204
205
206
207
208
209
 
 
 
 
 
210
211
212
...
59
60
61
 
62
63
64
65
66
67
68
 
69
70
71
72
...
78
79
80
 
81
82
83
84
...
115
116
117
 
118
119
120
121
...
140
141
142
 
143
144
145
146
...
195
196
197
 
 
 
 
198
199
200
201
202
203
204
205
206
207
208
 
 
209
210
211
212
213
214
215
216
0
@@ -59,14 +59,14 @@ module ActiveRecord
0
 
0
       def set_association_collection_records(id_to_record_map, reflection_name, associated_records, key)
0
         associated_records.each do |associated_record|
0
-          mapped_records = id_to_record_map[associated_record[key].to_i]
0
+          mapped_records = id_to_record_map[associated_record[key].to_s]
0
           add_preloaded_records_to_collection(mapped_records, reflection_name, associated_record)
0
         end
0
       end
0
 
0
       def set_association_single_records(id_to_record_map, reflection_name, associated_records, key)
0
         associated_records.each do |associated_record|
0
-          mapped_records = id_to_record_map[associated_record[key].to_i]
0
+          mapped_records = id_to_record_map[associated_record[key].to_s]
0
           mapped_records.each do |mapped_record|
0
             mapped_record.send("set_#{reflection_name}_target", associated_record)
0
           end
0
@@ -78,7 +78,7 @@ module ActiveRecord
0
         ids = []
0
         records.each do |record|
0
           ids << record.id
0
-          mapped_records = (id_to_record_map[record.id] ||= [])
0
+          mapped_records = (id_to_record_map[record.id.to_s] ||= [])
0
           mapped_records << record
0
         end
0
         ids.uniq!
0
@@ -115,7 +115,7 @@ module ActiveRecord
0
             source = reflection.source_reflection.name
0
             through_records.first.class.preload_associations(through_records, source)
0
             through_records.each do |through_record|
0
-              add_preloaded_record_to_collection(id_to_record_map[through_record[through_primary_key].to_i],
0
+              add_preloaded_record_to_collection(id_to_record_map[through_record[through_primary_key].to_s],
0
                                                  reflection.name, through_record.send(source))
0
             end
0
           end
0
@@ -140,7 +140,7 @@ module ActiveRecord
0
             source = reflection.source_reflection.name
0
             through_records.first.class.preload_associations(through_records, source)
0
             through_records.each do |through_record|
0
-              add_preloaded_records_to_collection(id_to_record_map[through_record[through_primary_key].to_i],
0
+              add_preloaded_records_to_collection(id_to_record_map[through_record[through_primary_key].to_s],
0
                                                  reflection.name, through_record.send(source))
0
             end
0
           end
0
@@ -195,18 +195,22 @@ module ActiveRecord
0
           records.each do |record|
0
             if klass = record.send(polymorph_type)
0
               klass_id = record.send(primary_key_name)
0
-
0
-              id_map = klasses_and_ids[klass] ||= {}
0
-              id_list_for_klass_id = (id_map[klass_id] ||= [])
0
-              id_list_for_klass_id << record
0
+              if klass_id
0
+                id_map = klasses_and_ids[klass] ||= {}
0
+                id_list_for_klass_id = (id_map[klass_id.to_s] ||= [])
0
+                id_list_for_klass_id << record
0
+              end
0
             end
0
           end
0
           klasses_and_ids = klasses_and_ids.to_a
0
         else
0
           id_map = {}
0
           records.each do |record|
0
-            mapped_records = (id_map[record.send(primary_key_name)] ||= [])
0
-            mapped_records << record
0
+            key = record.send(primary_key_name)
0
+            if key
0
+              mapped_records = (id_map[key.to_s] ||= [])
0
+              mapped_records << record
0
+            end
0
           end
0
           klasses_and_ids = [[reflection.klass.name, id_map]]
0
         end
...
11
12
13
 
 
 
14
15
16
17
18
 
19
20
21
...
220
221
222
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
223
224
225
...
11
12
13
14
15
16
17
18
19
20
 
21
22
23
24
...
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
0
@@ -11,11 +11,14 @@ require 'models/owner'
0
 require 'models/pet'
0
 require 'models/reference'
0
 require 'models/job'
0
+require 'models/subscriber'
0
+require 'models/subscription'
0
+require 'models/book'
0
 
0
 class EagerAssociationTest < ActiveRecord::TestCase
0
   fixtures :posts, :comments, :authors, :categories, :categories_posts,
0
             :companies, :accounts, :tags, :taggings, :people, :readers,
0
-            :owners, :pets, :author_favorites, :jobs, :references
0
+            :owners, :pets, :author_favorites, :jobs, :references, :subscribers, :subscriptions, :books
0
 
0
   def test_loading_with_one_association
0
     posts = Post.find(:all, :include => :comments)
0
@@ -220,6 +223,24 @@ class EagerAssociationTest < ActiveRecord::TestCase
0
     assert_no_queries{ assert_equal jobs(:unicyclist, :magician), michael.jobs.sort_by(&:id) }
0
   end
0
 
0
+  def test_eager_load_has_many_with_string_keys
0
+    subscriptions = subscriptions(:webster_awdr, :webster_rfr)
0
+    subscriber =Subscriber.find(subscribers(:second).id, :include => :subscriptions)
0
+    assert_equal subscriptions, subscriber.subscriptions.sort_by(&:id)
0
+  end
0
+  
0
+  def test_eager_load_has_many_through_with_string_keys
0
+    books = books(:awdr, :rfr)
0
+    subscriber = Subscriber.find(subscribers(:second).id, :include => :books)
0
+    assert_equal books, subscriber.books.sort_by(&:id)
0
+  end
0
+  
0
+  def test_eager_load_belongs_to_with_string_keys
0
+    subscriber = subscribers(:second)
0
+    subscription = Subscription.find(subscriptions(:webster_awdr).id, :include => :subscriber)
0
+    assert_equal subscriber, subscription.subscriber
0
+  end
0
+
0
   def test_eager_association_loading_with_explicit_join
0
     posts = Post.find(:all, :include => :comments, :joins => "INNER JOIN authors ON posts.author_id = authors.id AND authors.name = 'Mary'", :limit => 1, :order => 'author_id')
0
     assert_equal 1, posts.length
...
1
2
 
 
3
4
5
...
1
2
3
4
5
6
7
0
@@ -1,5 +1,7 @@
0
 class Subscriber < ActiveRecord::Base
0
   set_primary_key 'nick'
0
+  has_many :subscriptions
0
+  has_many :books, :through => :subscriptions
0
 end
0
 
0
 class SpecialSubscriber < Subscriber
...
349
350
351
 
 
 
 
 
352
353
354
...
349
350
351
352
353
354
355
356
357
358
359
0
@@ -349,6 +349,11 @@ ActiveRecord::Schema.define do
0
   end
0
   add_index :subscribers, :nick, :unique => true
0
 
0
+  create_table :subscriptions, :force => true do |t|
0
+    t.string :subscriber_id
0
+    t.integer :book_id
0
+  end
0
+
0
   create_table :tasks, :force => true do |t|
0
     t.datetime :starting
0
     t.datetime :ending

Comments