diff options
author | Jeremy Kemper <jeremy@bitsweat.net> | 2007-11-26 22:46:11 +0000 |
---|---|---|
committer | Jeremy Kemper <jeremy@bitsweat.net> | 2007-11-26 22:46:11 +0000 |
commit | c7e39691899b080a451a4c94a3632cada5ab0750 (patch) | |
tree | a8f4726cb92225a0bf7517ea666e3b644cd1cb1c /activerecord | |
parent | 8b3f83105ce719642a8f079f72c4f03c97cfc321 (diff) | |
download | rails-c7e39691899b080a451a4c94a3632cada5ab0750.tar.gz rails-c7e39691899b080a451a4c94a3632cada5ab0750.tar.bz2 rails-c7e39691899b080a451a4c94a3632cada5ab0750.zip |
Foxy fixtures: support single-table inheritance. Closes #10234.
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@8219 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
Diffstat (limited to 'activerecord')
-rw-r--r-- | activerecord/CHANGELOG | 2 | ||||
-rwxr-xr-x | activerecord/lib/active_record/fixtures.rb | 14 | ||||
-rw-r--r-- | activerecord/test/fixtures/db_definitions/schema.rb | 2 | ||||
-rw-r--r-- | activerecord/test/fixtures/parrot.rb | 8 | ||||
-rw-r--r-- | activerecord/test/fixtures/parrots.yml | 6 | ||||
-rwxr-xr-x | activerecord/test/fixtures_test.rb | 7 |
6 files changed, 37 insertions, 2 deletions
diff --git a/activerecord/CHANGELOG b/activerecord/CHANGELOG index a8ceea8aed..1cf65193a6 100644 --- a/activerecord/CHANGELOG +++ b/activerecord/CHANGELOG @@ -1,5 +1,7 @@ *SVN* +* Foxy fixtures: support single-table inheritance. #10234 [tom] + * Foxy fixtures: allow mixed usage to make migration easier and more attractive. #10004 [lotswholetime] * Make the record_timestamps class-inheritable so it can be set per model. #10004 [tmacedo] diff --git a/activerecord/lib/active_record/fixtures.rb b/activerecord/lib/active_record/fixtures.rb index 05c0aa0e39..40fbadc233 100755 --- a/activerecord/lib/active_record/fixtures.rb +++ b/activerecord/lib/active_record/fixtures.rb @@ -581,7 +581,15 @@ class Fixtures < YAML::Omap row[primary_key_name] = Fixtures.identify(label) end - model_class.reflect_on_all_associations.each do |association| + # If STI is used, find the correct subclass for association reflection + reflection_class = + if row.include?(inheritance_column_name) + row[inheritance_column_name].constantize rescue model_class + else + model_class + end + + reflection_class.reflect_on_all_associations.each do |association| case association.macro when :belongs_to # Do not replace association name with association foreign key if they are named the same @@ -650,6 +658,10 @@ class Fixtures < YAML::Omap end end + def inheritance_column_name + @inheritance_column_name ||= model_class && model_class.inheritance_column + end + def column_names @column_names ||= @connection.columns(@table_name).collect(&:name) end diff --git a/activerecord/test/fixtures/db_definitions/schema.rb b/activerecord/test/fixtures/db_definitions/schema.rb index f6bd0efa5d..a943b84f42 100644 --- a/activerecord/test/fixtures/db_definitions/schema.rb +++ b/activerecord/test/fixtures/db_definitions/schema.rb @@ -307,6 +307,8 @@ ActiveRecord::Schema.define do create_table :parrots, :force => true do |t| t.column :name, :string + t.column :parrot_sti_class, :string + t.column :killer_id, :integer t.column :created_at, :datetime t.column :created_on, :datetime t.column :updated_at, :datetime diff --git a/activerecord/test/fixtures/parrot.rb b/activerecord/test/fixtures/parrot.rb index 10850669e7..65191c1aa5 100644 --- a/activerecord/test/fixtures/parrot.rb +++ b/activerecord/test/fixtures/parrot.rb @@ -1,5 +1,13 @@ class Parrot < ActiveRecord::Base + set_inheritance_column :parrot_sti_class has_and_belongs_to_many :pirates has_and_belongs_to_many :treasures has_many :loots, :as => :looter end + +class LiveParrot < Parrot +end + +class DeadParrot < Parrot + belongs_to :killer, :class_name => 'Pirate' +end diff --git a/activerecord/test/fixtures/parrots.yml b/activerecord/test/fixtures/parrots.yml index dd2c9548e7..8b73b8cdf6 100644 --- a/activerecord/test/fixtures/parrots.yml +++ b/activerecord/test/fixtures/parrots.yml @@ -1,21 +1,27 @@ george: name: "Curious George" treasures: diamond, sapphire + parrot_sti_class: LiveParrot louis: name: "King Louis" treasures: [diamond, sapphire] + parrot_sti_class: LiveParrot frederick: name: $LABEL + parrot_sti_class: LiveParrot polly: id: 4 name: $LABEL + killer: blackbeard treasures: sapphire, ruby + parrot_sti_class: DeadParrot DEFAULTS: &DEFAULTS treasures: sapphire, ruby + parrot_sti_class: LiveParrot davey: <<: *DEFAULTS diff --git a/activerecord/test/fixtures_test.rb b/activerecord/test/fixtures_test.rb index d51a4029bc..c1e79b807f 100755 --- a/activerecord/test/fixtures_test.rb +++ b/activerecord/test/fixtures_test.rb @@ -562,12 +562,17 @@ class FoxyFixturesTest < Test::Unit::TestCase assert_equal(pirates(:redbeard), treasures(:sapphire).looter) assert_equal(parrots(:louis), treasures(:ruby).looter) end - + def test_only_generates_a_pk_if_necessary m = Matey.find(:first) m.pirate = pirates(:blackbeard) m.target = pirates(:redbeard) end + + def test_supports_sti + assert_kind_of DeadParrot, parrots(:polly) + assert_equal pirates(:blackbeard), parrots(:polly).killer + end end class ActiveSupportSubclassWithFixturesTest < ActiveSupport::TestCase |