我有以下两个模型
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
方法尚未执行。
有没有办法优化此代码以使其正常工作?
答案 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
顺便说一下,您还可以将提交代码包装到一个事务中,以确保创建所有记录或者在任何错误的情况下都没有。