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:
parent
0c12d6c6dc
commit
c95f066bf5
8 changed files with 49 additions and 0 deletions
|
@ -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 @@ 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
|
||||
|
|
|
@ -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|
|
||||
|
|
1
activerecord/test/fixtures/parrot.rb
vendored
1
activerecord/test/fixtures/parrot.rb
vendored
|
@ -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
activerecord/test/fixtures/pirate.rb
vendored
1
activerecord/test/fixtures/pirate.rb
vendored
|
@ -1,4 +1,5 @@
|
|||
class Pirate < ActiveRecord::Base
|
||||
belongs_to :parrot
|
||||
has_and_belongs_to_many :parrots
|
||||
has_many :loots, :as => :looter
|
||||
end
|
||||
|
|
1
activerecord/test/fixtures/treasure.rb
vendored
1
activerecord/test/fixtures/treasure.rb
vendored
|
@ -1,3 +1,4 @@
|
|||
class Treasure < ActiveRecord::Base
|
||||
has_and_belongs_to_many :parrots
|
||||
belongs_to :looter, :polymorphic => true
|
||||
end
|
||||
|
|
2
activerecord/test/fixtures/treasures.yml
vendored
2
activerecord/test/fixtures/treasures.yml
vendored
|
@ -3,6 +3,8 @@ diamond:
|
|||
|
||||
sapphire:
|
||||
name: $LABEL
|
||||
looter: redbeard (Pirate)
|
||||
|
||||
ruby:
|
||||
name: $LABEL
|
||||
looter: louis (Parrot)
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue