Rails STI:将记录从一个模型转移到另一个模型

Rails STI: transfer records from one model to another

我有一个模型叫做 Coupons 然后我有两个子模型 CouponApplicationsApprovedCoupons。 最后两个通过 STI 架构继承自 Coupons

现在我想实现以下几点:

  1. 用户看到 CouponApplications
  2. 他单击“批准”按钮,使 CouponApplications ApprovedCoupons

我意识到我可以简单地更新 Coupons 记录的 type 列来更改类型。但是,ApprovedCoupons 模型中有几个问题、挂钩等在创建后发生,所以这并不容易。事实上,我想创建一个全新的记录来触发那些关注点、钩子等

所以我写了这篇我认为非常糟糕的文章:

@coupon_application = CouponApplication.find(params[:id])
@approved_coupon = ApprovedCoupon.new

# copy/paste attributes except the ID as this would be considered a duplication
@approved_coupon.attributes = @coupon_application.attributes.except("id")

# set the new type
@approved_coupon.update_attributes(type: "Advertisement")

@approved_coupon.save

希望您能理解我想要实现的目标。它以这种方式工作,但我怀疑这是干净的代码。

总结一下:

有没有更好的方法?

您可以像这样向 CouponApplication 模型添加 approve 方法:

class CouponApplication < Coupon
  ...

  def approve
    data = attributes.except('id', 'created_at', 'updated_at')
    ApprovedCoupon.create(data.merge(type: 'Advertisement'))
  end
end

现在您的代码可以简化为:

@coupon_application = CouponApplication.find(params[:id])
@approved_coupon = @coupon_application.approve