更新刚刚在Callback中创建的现有记录

时间:2013-05-24 03:33:47

标签: ruby-on-rails ruby callback

通过after_create回调,我试图通过连接模型为User分配一个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和workout_order在连接表中创建一条记录,如图所示:

enter image description here

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

enter image description here

2 个答案:

答案 0 :(得分: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中执行此操作,则必须在用户模型上调用savesave!以实际将属性更改保留到数据库中。

答案 1 :(得分: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

它创建了为用户提供程序所需的结果,并分配了我需要的其他值。