我正在尝试使用一个表单更新两个模型。一切似乎都结账,期望两个模型都不会保存(无效),因为所需的customer_order_id。如何首先保存customer_order,以便它生成一个ID然后填充付款?
def create
@customer_order = CustomerOrder.new(customer_order_params)
if current_user.id.present?
@customer_order.user_id = current_user.id
@customer_order.payments.first.user_id = current_user.id
end
respond_to do |format|
if @customer_order.save
format.html { redirect_to @customer_order, notice: 'Customer order was successfully created.' }
当我检查模型是否有效时?这是error.message
{:"payments.customer_order_id"=>["can't be blank"], :payments=>["is invalid"]}
据我了解,customer_order将首先创建订单,然后创建付款。在此先感谢您的帮助。
答案 0 :(得分:2)
验证在保存到数据库之前运行。由于客户订单尚未保存,因此无法在此情况下验证customer_order_id
的存在。
请考虑验证customer_order
的存在。这允许验证在客户订单出现时通过,无论是否已保存。
通过关联和嵌套属性构建记录时,ActiveRecord将根据反向关联进行分配。在您的情况下,使用的逆关联是payments
(CustomerOrder
}和customer_order
(Payment
上)。当通过嵌套属性构建付款时,ActiveRecord将使用这些来正确设置payment.customer_order
。如果ActiveRecord无法确定反向关联(由于命名,关联中的连接等),那么您可能需要在每个关联中明确添加:inverse_of
选项。
答案 1 :(得分:0)
在你的创建后钩子中创建第一笔付款(在customer_order模型中)
#Customer order model
after_create :create_first_payment
def create_first_payment
self.payments.create(user_id: user_id)
end