Assign the association attributes to the associated record before the before_initialize callback of the record runs. Fixes #1842.
This commit is contained in:
parent
6a283d598f
commit
0e225ec583
@ -1,5 +1,17 @@
|
||||
*Rails 3.1.0 (unreleased)*
|
||||
|
||||
* ActiveRecord::MacroReflection::AssociationReflection#build_record has a new method signature.
|
||||
|
||||
Before: def build_association(*options)
|
||||
After: def build_association(*options, &block)
|
||||
|
||||
Users who are redefining this method to extend functionality should ensure that the block is
|
||||
passed through to ActiveRecord::Base#new.
|
||||
|
||||
This change is necessary to fix https://github.com/rails/rails/issues/1842.
|
||||
|
||||
[Jon Leighton]
|
||||
|
||||
* AR#pluralize_table_names can be used to singularize/pluralize table name of an individual model:
|
||||
|
||||
class User < ActiveRecord::Base
|
||||
|
@ -224,6 +224,15 @@ def stale_state
|
||||
def association_class
|
||||
@reflection.klass
|
||||
end
|
||||
|
||||
def build_record(attributes, options)
|
||||
reflection.build_association(attributes, options) do |record|
|
||||
record.assign_attributes(
|
||||
create_scope.except(*record.changed),
|
||||
:without_protection => true
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -423,12 +423,6 @@ def create_scope
|
||||
scoped.scope_for_create.stringify_keys
|
||||
end
|
||||
|
||||
def build_record(attributes, options)
|
||||
record = reflection.build_association(attributes, options)
|
||||
record.assign_attributes(create_scope.except(*record.changed), :without_protection => true)
|
||||
record
|
||||
end
|
||||
|
||||
def delete_or_destroy(records, method)
|
||||
records = records.flatten
|
||||
records.each { |record| raise_on_type_mismatch(record) }
|
||||
|
@ -26,8 +26,7 @@ def create!(attributes = {}, options = {}, &block)
|
||||
end
|
||||
|
||||
def build(attributes = {}, options = {})
|
||||
record = reflection.build_association(attributes, options)
|
||||
record.assign_attributes(create_scope.except(*record.changed), :without_protection => true)
|
||||
record = build_record(attributes, options)
|
||||
yield(record) if block_given?
|
||||
set_new_record(record)
|
||||
record
|
||||
|
@ -175,8 +175,8 @@ def initialize(macro, name, options, active_record)
|
||||
|
||||
# Returns a new, unsaved instance of the associated class. +options+ will
|
||||
# be passed to the class's constructor.
|
||||
def build_association(*options)
|
||||
klass.new(*options)
|
||||
def build_association(*options, &block)
|
||||
klass.new(*options, &block)
|
||||
end
|
||||
|
||||
# Creates a new instance of the associated class, and immediately saves it
|
||||
|
@ -1557,4 +1557,11 @@ def test_dont_call_save_callbacks_twice_on_has_many
|
||||
assert_equal 1, contract.hi_count
|
||||
assert_equal 1, contract.bye_count
|
||||
end
|
||||
|
||||
def test_association_attributes_are_available_to_after_initialize
|
||||
car = Car.create(:name => 'honda')
|
||||
bulb = car.bulbs.build
|
||||
|
||||
assert_equal car.id, bulb.attributes_after_initialize['car_id']
|
||||
end
|
||||
end
|
||||
|
@ -438,4 +438,11 @@ def test_create_bang_with_block
|
||||
bulb = car.create_bulb!{ |b| b.color = 'Red' }
|
||||
assert_equal 'RED!', bulb.color
|
||||
end
|
||||
|
||||
def test_association_attributes_are_available_to_after_initialize
|
||||
car = Car.create(:name => 'honda')
|
||||
bulb = car.create_bulb
|
||||
|
||||
assert_equal car.id, bulb.attributes_after_initialize['car_id']
|
||||
end
|
||||
end
|
||||
|
@ -4,13 +4,18 @@ class Bulb < ActiveRecord::Base
|
||||
|
||||
attr_protected :car_id, :frickinawesome
|
||||
|
||||
attr_reader :scope_after_initialize
|
||||
attr_reader :scope_after_initialize, :attributes_after_initialize
|
||||
|
||||
after_initialize :record_scope_after_initialize
|
||||
def record_scope_after_initialize
|
||||
@scope_after_initialize = self.class.scoped
|
||||
end
|
||||
|
||||
after_initialize :record_attributes_after_initialize
|
||||
def record_attributes_after_initialize
|
||||
@attributes_after_initialize = attributes.dup
|
||||
end
|
||||
|
||||
def color=(color)
|
||||
self[:color] = color.upcase + "!"
|
||||
end
|
||||
@ -28,4 +33,4 @@ def self.new(attributes = {}, options = {}, &block)
|
||||
end
|
||||
|
||||
class CustomBulb < Bulb
|
||||
end
|
||||
end
|
||||
|
Loading…
Reference in New Issue
Block a user