【问题标题】:Createing associated record in before_create callback在 before_create 回调中创建关联记录
【发布时间】:2011-07-08 02:25:44
【问题描述】:

我在 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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您需要在保存后执行此操作,因为在保存用户之前不会设置 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
      

      【讨论】:

      • 我是否应该这样做:self.create_team(name: "#{name}'s team") 以防止团队模型容易受到批量分配的影响?我尝试时它似乎不起作用?
      • 恐怕您的建议会失败,因为用户属于团队,而不是相反。当add_team_to_user 调用self.team.cre... 时,它会引发错误,因为self.team == nil 因为用户还没有团队。找我?这就是我在代码中使用user.create_team 的原因。不过,该方法似乎没有更新用户记录以正确表示关联。
      • 你知道吗,它实际上是一个 Rails 错误。请参阅此 github 问题:github.com/rails/rails/issues/1960
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多