1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

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
This commit is contained in:
Michael Koziarski 2007-11-20 21:53:22 +00:00
parent 0c12d6c6dc
commit c95f066bf5
8 changed files with 49 additions and 0 deletions

View file

@ -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]

View file

@ -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

View file

@ -327,6 +327,8 @@ ActiveRecord::Schema.define do
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|

View file

@ -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

View file

@ -1,4 +1,5 @@
class Pirate < ActiveRecord::Base
belongs_to :parrot
has_and_belongs_to_many :parrots
has_many :loots, :as => :looter
end

View file

@ -1,3 +1,4 @@
class Treasure < ActiveRecord::Base
has_and_belongs_to_many :parrots
belongs_to :looter, :polymorphic => true
end

View file

@ -3,6 +3,8 @@ diamond:
sapphire:
name: $LABEL
looter: redbeard (Pirate)
ruby:
name: $LABEL
looter: louis (Parrot)

View file

@ -528,6 +528,11 @@ class FoxyFixturesTest < Test::Unit::TestCase
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