我有一个名为Coupons
的模型
然后我有两个子模型CouponApplications
和ApprovedCoupons
。
最后两个通过STI架构从Coupons
继承。
现在我想要实现以下目标:
CouponApplications
ApprovedCoupons
我意识到我只需更新type
记录的Coupons
列即可更改类型。但是,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
记录而不是仅仅改变类型。有没有更好的方法?
答案 0 :(得分:1)
您可以在approve
模型中添加CouponApplication
方法,如下所示:
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