diff options
author | Nick Howard <ndh@baroquebobcat.com> | 2011-05-01 16:22:46 -0600 |
---|---|---|
committer | Nick Howard <ndh@baroquebobcat.com> | 2011-05-01 16:22:56 -0600 |
commit | 86ea94e4d0c228c79b3709f0c667ba90b02e41cd (patch) | |
tree | 1d2c41554c5a8b8f8cd1120d68b380fe5beb703c /activerecord/lib/active_record | |
parent | b8ccd0552473fbe0f346334e37b7d84481dd3533 (diff) | |
download | rails-86ea94e4d0c228c79b3709f0c667ba90b02e41cd.tar.gz rails-86ea94e4d0c228c79b3709f0c667ba90b02e41cd.tar.bz2 rails-86ea94e4d0c228c79b3709f0c667ba90b02e41cd.zip |
Fix for lighthouse #6741
- adds tests for find_or_create_by and find_or_initialize_by on has_many associations
- changes the behavior of ActiveRecord::Associations::CollectionProxy#method_missing to differ to
ActiveRecord::FinderMethods#find_or_instantiator_by_attributes for arg processing and saving so
find_or_create_by's api on associations will be consistent w/ the api for model classes.
Diffstat (limited to 'activerecord/lib/active_record')
-rw-r--r-- | activerecord/lib/active_record/associations/collection_proxy.rb | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/activerecord/lib/active_record/associations/collection_proxy.rb b/activerecord/lib/active_record/associations/collection_proxy.rb index 388173c1fb..adfc71d435 100644 --- a/activerecord/lib/active_record/associations/collection_proxy.rb +++ b/activerecord/lib/active_record/associations/collection_proxy.rb @@ -64,9 +64,12 @@ module ActiveRecord def method_missing(method, *args, &block) match = DynamicFinderMatch.match(method) - if match && match.creator? - attributes = match.attribute_names - return send(:"find_by_#{attributes.join('_and_')}", *args) || create(Hash[attributes.zip(args)]) + if match && match.instantiator? + record = send(:find_or_instantiator_by_attributes, match, match.attribute_names, *args) do |r| + @association.send :set_owner_attributes, r + @association.send :add_to_target, r + yield(r) if block_given? + end end if target.respond_to?(method) || (!@association.klass.respond_to?(method) && Class.respond_to?(method)) |