This project is archived and is in readonly mode.
Invalid has_one association causes parent object save to fail
Reported by Luke Redpath | June 5th, 2008 @ 11:18 AM
This ticket on the old Rails trac supplied a patch that changes the behaviour of has_one; now, if the associated record is invalid, the parent object will not save. This was supposedly to make it consistent with has_many and was introduced in this changeset
I'm am opening this ticket because I consider this a bug and an undocumented feature change and I'm struggling to understand why this was introduced; it has broken part of an application that I'm attempting to upgrade to Rails 2.1 and I have spent the best part of a few hours trying to track this down.
The reason I consider this a bug is because there is already a way of producing this behaviour explicitly using validates_associated. Why, if this can be done manually (when required) is this being done automatically?
The last post in the old Trac ticket demonstrates a catch-22 situation which is what lead to my own test failures. Here is an example that fails as a result of this new behaviour:
class Snippet
has_one :wiki_entry
end
class WikiEntry
belongs_to :snippet
validates_presence_of :snippet_id <= this is the important bit!
end
s = Snippet.new
s.build_wiki_entry
s.save # => FAIL!
WikiEntry fails validation because it requires a snippet_id. It cannot get a snippet_id until it's parent Snippet has been saved. But we cannot save the parent Snippet because it's child WikIEntry is valid; catch-22.
Comments and changes to this ticket
-
Luke Redpath June 5th, 2008 @ 11:21 AM
One further note, this appears to be related to this ticket
It appears some kind of fix has been checked in (a :validate option to disable this behaviour) but I still consider this to be a bug unless this behaviour is either disabled by default or properly documented.
-
Drew Blas June 9th, 2008 @ 10:35 PM
+1
I'd like to see this removed entirely. We already had a perfectly good method for the validation. This undocumented and entirely unexpected behavior is much more bug than feature.
-
Pratik June 11th, 2008 @ 12:34 PM
- State changed from new to resolved
http://github.com/rails/rails/co... disabled it by default.
-
Luke Redpath June 11th, 2008 @ 01:23 PM
- Assigned user set to Pratik
There seems to be some inconsistency in the documentation in that commit; sometimes it says false by default, sometimes it is true by default. Is this just a documentation error?
-
Pratik June 11th, 2008 @ 01:33 PM
It's false by default for has_one and belongs_to. Made another commits to fix docs/bheavior.
Thanks
Create your profile
Help contribute to this project by taking a few moments to create your personal profile. Create your profile »
<h2 style="font-size: 14px">Tickets have moved to Github</h2>
The new ticket tracker is available at <a href="https://github.com/rails/rails/issues">https://github.com/rails/rails/issues</a>
People watching this ticket
Tags
Referenced by
- 301 SystemStackError with has_one Related to my ticket