Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Ensure that 'autosaving' works when associations aren't loaded [Bryan…

… Helmkamp] References #8713

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@7824 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
  • Loading branch information...
commit 1c881ca5bfc36689b4918edf497b38d24df7b57e 1 parent 4db4661
@NZKoz NZKoz authored
View
15 activerecord/lib/active_record/associations.rb
@@ -1072,12 +1072,15 @@ def add_multiple_associated_save_callbacks(association_name)
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
View
4 activerecord/test/associations_test.rb
@@ -101,6 +101,10 @@ def test_save_on_parent_does_not_load_target
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
View
5 activerecord/test/fixtures/db_definitions/schema.rb
@@ -75,4 +75,9 @@ def create_table(*args, &block)
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
View
10 activerecord/test/fixtures/developer.rb
@@ -41,8 +41,18 @@ def find_least_recent
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)
Please sign in to comment.
Something went wrong with that request. Please try again.