Rails STI:将记录从一个模型传输到另一个模型



我有一个叫做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

我希望你能理解我想要达到的目的。它是这样工作的,但我怀疑这是干净的代码。

总结:

  • 我想将Coupon类型从CouponApplication更改为ApprovedCoupon
  • 我仍然想在ApprovedCoupon模型中触发关注点,钩子等,所以我决定创建一个新的ApprovedCoupon

有更好的方法吗?

您可以像这样为您的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

最新更新