Permalink
Browse files

Add 'foxy' support for fixtures of polymorphic associations. Closes #…

…10183 [jbarnette, David Lowenfels]

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@8170 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
  • Loading branch information...
1 parent 0c12d6c commit c95f066bf5b5121ff86db090eff3436e63db9230 @NZKoz NZKoz committed Nov 20, 2007
View
@@ -1,5 +1,7 @@
*SVN*
+* Add 'foxy' support for fixtures of polymorphic associations. #10183 [jbarnette, David Lowenfels]
+
* attr_readonly behaves well with optimistic locking. #10188 [Nick Bugajski]
* Base#to_xml supports the nil="true" attribute like Hash#to_xml. #8268 [Catfish]
@@ -301,6 +301,31 @@ class FixtureClassNotFound < ActiveRecord::ActiveRecordError #:nodoc:
# a target *label* for the *association* (monkey: george) rather than
# a target *id* for the *FK* (monkey_id: 1).
#
+# ==== Polymorphic belongs_to
+#
+# Supporting polymorphic relationships is a little bit more complicated, since
+# ActiveRecord needs to know what type your association is pointing at. Something
+# like this should look familiar:
+#
+# ### in fruit.rb
+#
+# belongs_to :eater, :polymorphic => true
+#
+# ### in fruits.yml
+#
+# apple:
+# id: 1
+# name: apple
+# eater_id: 1
+# eater_type: Monkey
+#
+# Can we do better? You bet!
+#
+# apple:
+# eater: george (Monkey)
+#
+# Just provide the polymorphic target type and ActiveRecord will take care of the rest.
+#
# === has_and_belongs_to_many
#
# Time to give our monkey some fruit.
@@ -556,6 +581,16 @@ def insert_fixtures
case association.macro
when :belongs_to
if value = row.delete(association.name.to_s)
+ if association.options[:polymorphic]
+ if value.sub!(/\s*\(([^\)]*)\)\s*$/, "")
+ target_type = $1
+ target_type_name = (association.options[:foreign_type] || "#{association.name}_type").to_s
+
+ # support polymorphic belongs_to as "label (Type)"
+ row[target_type_name] = target_type
+ end
+ end
+
fk_name = (association.options[:foreign_key] || "#{association.name}_id").to_s
row[fk_name] = Fixtures.identify(value)
end
@@ -327,6 +327,8 @@ def create_table(*args, &block)
create_table :treasures, :force => true do |t|
t.column :name, :string
+ t.column :looter_id, :integer
+ t.column :looter_type, :string
end
create_table :parrots_treasures, :id => false, :force => true do |t|
@@ -1,4 +1,5 @@
class Parrot < ActiveRecord::Base
has_and_belongs_to_many :pirates
has_and_belongs_to_many :treasures
+ has_many :loots, :as => :looter
end
@@ -1,4 +1,5 @@
class Pirate < ActiveRecord::Base
belongs_to :parrot
has_and_belongs_to_many :parrots
+ has_many :loots, :as => :looter
end
@@ -1,3 +1,4 @@
class Treasure < ActiveRecord::Base
has_and_belongs_to_many :parrots
+ belongs_to :looter, :polymorphic => true
end
@@ -3,6 +3,8 @@ diamond:
sapphire:
name: $LABEL
+ looter: redbeard (Pirate)
ruby:
name: $LABEL
+ looter: louis (Parrot)
@@ -528,6 +528,11 @@ def test_strips_DEFAULTS_key
def test_supports_label_interpolation
assert_equal("frederick", parrots(:frederick).name)
end
+
+ def test_supports_polymorphic_belongs_to
+ assert_equal(pirates(:redbeard), treasures(:sapphire).looter)
+ assert_equal(parrots(:louis), treasures(:ruby).looter)
+ end
end
class ActiveSupportSubclassWithFixturesTest < ActiveSupport::TestCase

0 comments on commit c95f066

Please sign in to comment.