aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib
diff options
context:
space:
mode:
authorNick Howard <ndh@baroquebobcat.com>2011-05-01 16:22:46 -0600
committerNick Howard <ndh@baroquebobcat.com>2011-05-01 16:22:56 -0600
commit86ea94e4d0c228c79b3709f0c667ba90b02e41cd (patch)
tree1d2c41554c5a8b8f8cd1120d68b380fe5beb703c /activerecord/lib
parentb8ccd0552473fbe0f346334e37b7d84481dd3533 (diff)
downloadrails-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')
-rw-r--r--activerecord/lib/active_record/associations/collection_proxy.rb9
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))