aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord
diff options
context:
space:
mode:
authorJeremy Kemper <jeremy@bitsweat.net>2007-11-26 22:46:11 +0000
committerJeremy Kemper <jeremy@bitsweat.net>2007-11-26 22:46:11 +0000
commitc7e39691899b080a451a4c94a3632cada5ab0750 (patch)
treea8f4726cb92225a0bf7517ea666e3b644cd1cb1c /activerecord
parent8b3f83105ce719642a8f079f72c4f03c97cfc321 (diff)
downloadrails-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/CHANGELOG2
-rwxr-xr-xactiverecord/lib/active_record/fixtures.rb14
-rw-r--r--activerecord/test/fixtures/db_definitions/schema.rb2
-rw-r--r--activerecord/test/fixtures/parrot.rb8
-rw-r--r--activerecord/test/fixtures/parrots.yml6
-rwxr-xr-xactiverecord/test/fixtures_test.rb7
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