aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/fixtures.rb
diff options
context:
space:
mode:
authorMichael Koziarski <michael@koziarski.com>2007-11-20 21:53:22 +0000
committerMichael Koziarski <michael@koziarski.com>2007-11-20 21:53:22 +0000
commitc95f066bf5b5121ff86db090eff3436e63db9230 (patch)
tree582d35eeaff9f9a6d3bb3f8f3bc584defe40933d /activerecord/lib/active_record/fixtures.rb
parent0c12d6c6dc66cb7873969fc7f982ad9244a4ea00 (diff)
downloadrails-c95f066bf5b5121ff86db090eff3436e63db9230.tar.gz
rails-c95f066bf5b5121ff86db090eff3436e63db9230.tar.bz2
rails-c95f066bf5b5121ff86db090eff3436e63db9230.zip
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
Diffstat (limited to 'activerecord/lib/active_record/fixtures.rb')
-rwxr-xr-xactiverecord/lib/active_record/fixtures.rb35
1 files changed, 35 insertions, 0 deletions
diff --git a/activerecord/lib/active_record/fixtures.rb b/activerecord/lib/active_record/fixtures.rb
index 84e7c84d64..97fca6026b 100755
--- a/activerecord/lib/active_record/fixtures.rb
+++ b/activerecord/lib/active_record/fixtures.rb
@@ -301,6 +301,31 @@ end
# 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 @@ class Fixtures < YAML::Omap
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