From 8b3f83105ce719642a8f079f72c4f03c97cfc321 Mon Sep 17 00:00:00 2001 From: Jeremy Kemper Date: Mon, 26 Nov 2007 22:45:43 +0000 Subject: Foxy fixtures: allow mixed usage to make migration easier and more attractive. Closes #10004. git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@8218 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- activerecord/lib/active_record/fixtures.rb | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) (limited to 'activerecord/lib/active_record') diff --git a/activerecord/lib/active_record/fixtures.rb b/activerecord/lib/active_record/fixtures.rb index fbd614c969..05c0aa0e39 100755 --- a/activerecord/lib/active_record/fixtures.rb +++ b/activerecord/lib/active_record/fixtures.rb @@ -563,10 +563,12 @@ class Fixtures < YAML::Omap each do |label, fixture| row = fixture.to_hash - if model_class && model_class < ActiveRecord::Base && !row[primary_key_name] - # fill in timestamp columns if they aren't specified - timestamp_column_names.each do |name| - row[name] = now unless row.key?(name) + if model_class && model_class < ActiveRecord::Base + # fill in timestamp columns if they aren't specified and the model is set to record_timestamps + if model_class.record_timestamps + timestamp_column_names.each do |name| + row[name] = now unless row.key?(name) + end end # interpolate the fixture label @@ -575,12 +577,17 @@ class Fixtures < YAML::Omap end # generate a primary key if necessary - row[primary_key_name] = Fixtures.identify(label) if has_primary_key? + if has_primary_key_column? && !row.include?(primary_key_name) + row[primary_key_name] = Fixtures.identify(label) + end model_class.reflect_on_all_associations.each do |association| case association.macro when :belongs_to - if value = row.delete(association.name.to_s) + # Do not replace association name with association foreign key if they are named the same + fk_name = (association.options[:foreign_key] || "#{association.name}_id").to_s + + if association.name.to_s != fk_name && value = row.delete(association.name.to_s) if association.options[:polymorphic] if value.sub!(/\s*\(([^\)]*)\)\s*$/, "") target_type = $1 @@ -591,7 +598,6 @@ class Fixtures < YAML::Omap end end - fk_name = (association.options[:foreign_key] || "#{association.name}_id").to_s row[fk_name] = Fixtures.identify(value) end when :has_and_belongs_to_many @@ -601,7 +607,7 @@ class Fixtures < YAML::Omap targets.each do |target| join_fixtures["#{label}_#{target}"] = Fixture.new( - { association.primary_key_name => Fixtures.identify(label), + { association.primary_key_name => row[primary_key_name], association.association_foreign_key => Fixtures.identify(target) }, nil) end end @@ -633,10 +639,11 @@ class Fixtures < YAML::Omap @primary_key_name ||= model_class && model_class.primary_key end - def has_primary_key? - model_class && model_class.columns.any? { |c| c.name == primary_key_name } + def has_primary_key_column? + @has_primary_key_column ||= model_class && primary_key_name && + model_class.columns.find { |c| c.name == primary_key_name } end - + def timestamp_column_names @timestamp_column_names ||= %w(created_at created_on updated_at updated_on).select do |name| column_names.include?(name) -- cgit v1.2.3