我有一个叫做Coupons
的模型然后我有两个子模型CouponApplications
和ApprovedCoupons
。后两者通过STI体系结构继承自Coupons
。
现在我想实现以下几点:
- 用户看到CouponApplications
- 他点击批准按钮,使
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