David Tuite
David Tuite

Reputation: 22663

Createing associated record in before_create callback

I have the following classes in a Rails 3.1.rc4

class User < ActiveRecord::Base
  belongs_to :team
end

class Team < ActiveRecord::Base
  has_many :users
end

What I'd like to do is create an associated team every time a user signs up using an activerecord callback. Something like this:

# in the User class
before_create {|user| user.create_team(name: "#{self.name}'s Team") }

However this doesn't seem to work properly. When I go to the rails console to check it, I can create a user and type user.team and I get a team as expected. However, if I do user.reload and user.team again, I get nil.

How do I get the user to properly associate with the team?

Upvotes: 1

Views: 2581

Answers (2)

David Tuite
David Tuite

Reputation: 22663

Turns out 3.1.rc4 actually has a bug which prevents user.create_team from working properly. See the issue on the rails github. A fix has been pushed so I guess it will be fixed in the next RC.

Upvotes: 1

Sam 山
Sam 山

Reputation: 42863

You need to do this with an after save because the id is not set until the user is saved. Rails won't let this record save because the associated record, the user model, has not been saved and does not have an id.

So you should do this:

class User < ActiveRecord::Base

  belongs_to :team

  after_create add_team_to_user

  def add_team_to_user
      Team.create({:user => self, :name => "#{name}'s Team"})
  end

end

Or to prevent mass-asignment:

def add_team_to_user
    self.team.create({:user => self, :name => "#{name}'s Team"})
end

Upvotes: 0

Related Questions