【问题标题】:Updating an existing record just created in a Callback更新刚刚在回调中创建的现有记录
【发布时间】:2013-05-24 03:33:47
【问题描述】:

通过 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,但分配了其他值。见下图:

【问题讨论】:

    标签: ruby-on-rails ruby callback


    【解决方案1】:

    您可能应该运行您的回调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! 才能将属性更改实际持久化到数据库中。

    【讨论】:

    • Save 是 []:ActiveRecord::Relation 的未定义方法 `save',并且 before_create 无法工作,因为除非父对象被保存,否则无法调用 create
    • 我的意思是在用户模型上调用save!。如果父记录尚不存在,您需要使用build 而不是create 来构建连接模型。我添加了一些示例代码来澄清。
    • 这行得通,但我又回到了创建两条记录的原始问题。
    • 如果没有进一步的细节,我想我不明白你期望什么行为。也许您应该在问题中澄清“user_programs”是什么以及正在创建哪两条记录。
    • 我刚刚更新了问题。 user_programs 只是一个用户分配的程序表。用户的最新记录是用户当前拥有的节目。有意义吗?
    【解决方案2】:

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

    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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-26
      • 1970-01-01
      • 1970-01-01
      • 2011-09-09
      • 2012-02-17
      • 1970-01-01
      • 1970-01-01
      • 2016-12-09
      相关资源
      最近更新 更多