Permalink
Browse files

fix inverse_of when find_or_initialize_by_*

inverse_of relation was not being set when calling find_or_initialize_by_ and the entry was
found on the db.
  • Loading branch information...
1 parent e82ceca commit fed6ac9c66e87d120098b3a4ffb15699d0ee6863 @arthurnn arthurnn committed Sep 26, 2013
@@ -1,5 +1,10 @@
## unreleased ##
+* When calling the method .find_or_initialize_by_* from a collection_proxy
+ it should set the inverse_of relation even when the entry was found on the db.
+
+ *arthurnn*
+
* Callbacks on has_many should access the in memory parent if a inverse_of is set.
*arthurnn*
@@ -77,10 +77,12 @@ def respond_to?(name, include_private = false)
def method_missing(method, *args, &block)
match = DynamicFinderMatch.match(method)
if match && match.instantiator?
- send(:find_or_instantiator_by_attributes, match, match.attribute_names, *args) do |r|
- proxy_association.send :set_owner_attributes, r
- proxy_association.send :add_to_target, r
- yield(r) if block_given?
+ send(:find_or_instantiator_by_attributes, match, match.attribute_names, *args) do |record|
+ proxy_association.send :set_owner_attributes, record
+ proxy_association.send :add_to_target, record
+ yield(record) if block_given?
+ end.tap do |record|
+ proxy_association.send :set_inverse_instance, record
end
elsif target.respond_to?(method) || (!proxy_association.klass.respond_to?(method) && Class.respond_to?(method))
@@ -662,6 +662,17 @@ def test_inverse_on_before_validate
end
end
+ def test_inverse_after_find_or_initialize
+ firm = companies(:first_firm)
+ client = firm.clients_of_firm.find_or_initialize_by_client_of(firm.id)
+ assert_no_queries do
+ assert_equal firm, client.firm
+ end
+
+ firm.name = "A new firm"
+ assert_equal firm.name, client.firm.name
+ end
+
def test_new_aliased_to_build
company = companies(:first_firm)
new_client = assert_no_queries { company.clients_of_firm.new("name" => "Another Client") }

0 comments on commit fed6ac9

Please sign in to comment.