Saving an active record, in what order are the associated objects saved?

Posted by Bryan on Stack Overflow See other posts from Stack Overflow or by Bryan
Published on 2010-04-20T03:20:14Z Indexed on 2010/04/21 4:23 UTC
Read the original article Hit count: 236

Filed under:
|

In rails, when saving an active_record object, its associated objects will be saved as well. But has_one and has_many association have different order in saving objects.

I have three simplified models:

class Team < ActiveRecord::Base
  has_many :players
  has_one :coach
end

class Player < ActiveRecord::Base
  belongs_to :team
  validates_presence_of :team_id
end

class Coach < ActiveRecord::Base
  belongs_to :team
  validates_presence_of :team_id
end

I expected that when team.save is called, team should be saved before its associated coach and players.

I use the following code to test these models:

t = Team.new
team.coach = Coach.new
team.save!

team.save! returns true.

But in another test:

t = Team.new
team.players << Player.new
team.save!

team.save! gives the following error:

> ActiveRecord::RecordInvalid:
> Validation failed: Players is invalid

I figured out that team.save! saves objects in the following order: 1) players, 2) team, and 3) coach. This is why I got the error: When a player is saved, team doesn't yet have a id, so validates_presence_of :team_id fails in player.

Can someone explain to me why objects are saved in this order? This seems not logical to me.

© Stack Overflow or respective owner

Related posts about ruby-on-rails

Related posts about activerecord