提交 c95f066b 编写于 作者: M Michael Koziarski

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

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
上级 0c12d6c6
*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|
......
class Parrot < ActiveRecord::Base
has_and_belongs_to_many :pirates
has_and_belongs_to_many :treasures
has_many :loots, :as => :looter
end
class Pirate < ActiveRecord::Base
belongs_to :parrot
has_and_belongs_to_many :parrots
has_many :loots, :as => :looter
end
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
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册