在before_create回调中创建关联记录

时间:2011-07-08 02:25:45

标签: ruby-on-rails ruby-on-rails-3 activerecord ruby-on-rails-3.1

我在Rails 3.1.rc4

中有以下类
class User < ActiveRecord::Base
  belongs_to :team
end

class Team < ActiveRecord::Base
  has_many :users
end

我想做的是每次用户使用activerecord回调注册时创建一个关联的团队。像这样:

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

然而,这似乎不能正常工作。当我转到rails console进行检查时,我可以创建一个用户并输入user.team,然后按预期获得一个团队。但是,如果我再次user.reloaduser.team,我会nil

如何让用户与团队正确关联?

2 个答案:

答案 0 :(得分:1)

原来3.1.rc4实际上有一个错误阻止user.create_team正常工作。见the issue on the rails github。修正已被推送,所以我猜它将在下一个RC中修复。

答案 1 :(得分:0)

您需要在保存之后执行此操作,因为在保存用户之前不会设置ID。 Rails不会让此记录保存,因为相关记录(用户模型)尚未保存且没有ID。

所以你应该这样做:

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

或者为了防止大规模调整:

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