0

通过 after_create 回调,我试图通过连接模型为用户分配 Program_id,并为同一连接模型中的三个附加参数分配初始值。

分配 program_id 工作正常,我不知道如何添加其他参数。

class User < ActiveRecord::Base

after_create :assign_user_program, :add_initial_programs

  def assign_user_program
    self.programs = Program.for_user(self)
  end

class Program < ActiveRecord:Base

  def self.for_user(user)
    where(:goal_id => user.goal_id, :experience_id => user.experience_level_id, :gender => user.gender) 
  end

我尝试在 after_create 中创建另一个方法来分配其他三个参数,但这只是在连接模型中创建另一个记录,并分配了三个参数,并且没有 program_id

def add_initial_programs
   self.user_programs.create(:cycle_order => 1, :group_order => 1, :workout_order => 1)
end

关于如何简单地更新刚刚创建的记录的任何想法?

编辑:

澄清一下,我试图在连接表中创建一条记录,其中包括 program_id、user_id、group_order、cycle_order 和锻炼顺序,如图所示:

在此处输入图像描述

发生的事情是我得到两条记录,一条带有 program_id,另一条没有 program_id,但分配了其他值。见下图:

在此处输入图像描述

4

2 回答 2

0

所以这里的答案其实很简单。我需要将所有逻辑放入一个方法中,如下所示:

def add_initial_program
    prog_id = Program.for_user(self).first.id
    self.user_programs.build( :cycle_order => 1, :group_order => 1, :workout_order => 1, :program_id => prog_id)
  end

这创造了为用户提供程序并分配我需要的其他值的预期结果。

于 2013-06-28T15:50:21.053 回答
0

您可能应该运行您的回调before_create,而不是after_create在模型持久化到数据库之前在模型上设置额外的属性。这样做after_create意味着您最终将发送两个查询(一个CREATE和一个UPDATE)而不是一个CREATE

class User < ActiveRecord::Base
  before_create :assign_user_program, :add_initial_programs

  protected

  def assign_user_program
    self.programs = Program.for_user(self)
  end

  def add_initial_programs
    self.user_programs.build(:cycle_order => 1, :group_order => 1, :workout_order => 1)
  end
end

如果您真的想在 中执行此操作after_create,则必须在用户模型上调用saveorsave!才能将属性更改实际保存到数据库中。

于 2013-05-24T05:04:17.597 回答