Rails STI:将记录从一个模型转移到另一个模型
Rails STI: transfer records from one model to another
我有一个模型叫做 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
我有一个模型叫做 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