diff options
-rwxr-xr-x | activerecord/lib/active_record/associations.rb | 15 | ||||
-rwxr-xr-x | activerecord/test/associations_test.rb | 4 | ||||
-rw-r--r-- | activerecord/test/fixtures/db_definitions/schema.rb | 5 | ||||
-rw-r--r-- | activerecord/test/fixtures/developer.rb | 10 |
4 files changed, 28 insertions, 6 deletions
diff --git a/activerecord/lib/active_record/associations.rb b/activerecord/lib/active_record/associations.rb index 1a4a46eb3d..ab4e02f86c 100755 --- a/activerecord/lib/active_record/associations.rb +++ b/activerecord/lib/active_record/associations.rb @@ -1072,12 +1072,15 @@ module ActiveRecord after_callback = <<-end_eval association = instance_variable_get("@#{association_name}") - if association.respond_to?(:loaded?) && association.loaded? - if @new_record_before_save - records_to_save = association - else - records_to_save = association.select { |record| record.new_record? } - end + records_to_save = if @new_record_before_save + association + elsif association.respond_to?(:loaded?) && association.loaded? + association.select { |record| record.new_record? } + else + [] + end + + if !records_to_save.blank? records_to_save.each { |record| association.send(:insert_record, record) } association.send(:construct_sql) # reconstruct the SQL queries now that we know the owner's id end diff --git a/activerecord/test/associations_test.rb b/activerecord/test/associations_test.rb index 37e26ef80a..9e4d0f2711 100755 --- a/activerecord/test/associations_test.rb +++ b/activerecord/test/associations_test.rb @@ -101,6 +101,10 @@ class AssociationProxyTest < Test::Unit::TestCase assert !david.projects.loaded? end + def test_save_on_parent_saves_children + developer = Developer.create :name => "Bryan", :salary => 50_000 + assert_equal 1, developer.reload.audit_logs.size + end end class HasOneAssociationsTest < Test::Unit::TestCase diff --git a/activerecord/test/fixtures/db_definitions/schema.rb b/activerecord/test/fixtures/db_definitions/schema.rb index cdebcbbe5f..52cd9f36f0 100644 --- a/activerecord/test/fixtures/db_definitions/schema.rb +++ b/activerecord/test/fixtures/db_definitions/schema.rb @@ -75,4 +75,9 @@ ActiveRecord::Schema.define do t.column :real_number, :real end end + + create_table :audit_logs, :force => true do |t| + t.column :message, :string, :null=>false + t.column :developer_id, :integer, :null=>false + end end diff --git a/activerecord/test/fixtures/developer.rb b/activerecord/test/fixtures/developer.rb index c868cddecd..20005ed04e 100644 --- a/activerecord/test/fixtures/developer.rb +++ b/activerecord/test/fixtures/developer.rb @@ -41,8 +41,18 @@ class Developer < ActiveRecord::Base has_and_belongs_to_many :special_projects, :join_table => 'developers_projects', :association_foreign_key => 'project_id' + has_many :audit_logs + validates_inclusion_of :salary, :in => 50000..200000 validates_length_of :name, :within => 3..20 + + before_create do |developer| + developer.audit_logs.build :message => "Computer created" + end +end + +class AuditLog < ActiveRecord::Base + belongs_to :developer end DeveloperSalary = Struct.new(:amount) |