Validating the presence of a foreign key?

99 views
Skip to first unread message

Ben Johnson

unread,
Dec 12, 2007, 3:08:19 AM12/12/07
to rubyonra...@googlegroups.com
In the docs it says I should validate the presence of the foreign key
and not the object itself. I did this and I still get the error when
both objects are new records. A very simple example:


class UserGroup < ActiveRecord::Base
has_many :users, :dependent => :destroy
end

class User < ActiveRecord::Base
belongs_to :user_group
validates_presence_of :user_group_id
end


user_group = UserGroup.new
user_group.users.build
user_group.save!


Tells me that users is invalid and it says that user group cant be
blank. In the docs it says if I do this I should not get this error. Is
this a new edition to ActiveRecord or something? I am using edge rails.
Thanks!
--
Posted via http://www.ruby-forum.com/.

Mark Wilden

unread,
Dec 12, 2007, 12:43:20 PM12/12/07
to Ruby on Rails: Talk
The problem is that user_group.id is nil, so when build is called, the
child User object that's created has a nil foreign key. The save on
the next line fails for this reason. If you replace UserGroup.new with
UserGroup.create!, I'll bet it would work.

That's my take, at least, and it matches the behavior I've seen: You
have to save the new parent before adding children. This does not
match my understanding of the Agile book, but I've written some tests,
and that's what seems to be necessary.

///ark

Mark Reginald James

unread,
Dec 12, 2007, 9:52:27 PM12/12/07
to rubyonra...@googlegroups.com

To my mind the API doc's advice to validate presence of foreign keys
rather than associations is wrong, as I have written about before:

http://groups.google.com/group/rubyonrails-talk/msg/0c827209dd10e767

Validating the presence of associations is the Rails equivalent of
DB fk constraints. Validating the presence of foreign_key attributes
just checks that they're not null. They could still point to
non-existent records.

--
We develop, watch us RoR, in numbers too big to ignore.

Thufir

unread,
Dec 13, 2007, 3:46:13 AM12/13/07
to rubyonra...@googlegroups.com
On Thu, 13 Dec 2007 13:52:27 +1100, Mark Reginald James wrote:


> http://groups.google.com/group/rubyonrails-talk/msg/0c827209dd10e767
>
> Validating the presence of associations is the Rails equivalent of DB fk
> constraints. Validating the presence of foreign_key attributes just
> checks that they're not null. They could still point to non-existent
> records.

Ohh, thanks for the information.


-Thufir

Reply all
Reply to author
Forward
0 new messages