This project is archived and is in readonly mode.

#338 ✓resolved
Luke Redpath

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

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>

Referenced by

Pages