确保在保存和创建主模型后创建或保存关联Rails 4

时间:2016-11-18 08:38:52

标签: ruby-on-rails ruby ruby-on-rails-4 activerecord rails-activerecord

我有以下两个模型

class Application < ActiveRecord::Base
  has_many :commitments, class_name: "Commitment", \
    :source => :application, dependent: :destroy
  accepts_nested_attributes_for :commitments

  after_create: update_case_code

end

class Commitment < ActiveRecord::Base
  belongs_to :application
  after_create: send_notification 

  def send_notification
    ap self.application.case_code
  end
end

class ApplicationsController < ApplicationController
  def create
    @application = Application.new(params)
    @application.save
  end
end

在我的application_controller中,每当我创建一个新的Application记录时,也会在Commitment中创建一条新记录,它会尝试从应用程序记录中获取case_code,但是应用程序模型的after_create方法尚未执行。

有没有办法优化此代码以使其正常工作?

1 个答案:

答案 0 :(得分:1)

可能有。也许你也可以在之前发生的应用程序模型上使用另一个回调,其中有很多。见Active Record Callbacks

然而情况确实如此,其他人称之为rails callback hell

这里的最佳做法是创建一个表单对象,它按照您需要的顺序创建数据并删除回调

class ApplicationCommitmentForm
  include ActiveModel::Model


  attr_accessor ...

  def submit
    a = Application.create ..
    a.update_case_code
    a.commitments.create ...
  end


end

请参阅ActiveModel Form Objects

顺便说一下,您还可以将提交代码包装到一个事务中,以确保创建所有记录或者在任何错误的情况下都没有。