通过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在连接表中创建一条记录,如图所示:
发生的事情是我得到两条记录,一条带有program_id,另一条没有program_id,但是分配了其他值。见下图:
答案 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
中执行此操作,则必须在用户模型上调用save
或save!
以实际将属性更改保留到数据库中。
答案 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
它创建了为用户提供程序所需的结果,并分配了我需要的其他值。