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
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.
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>