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

时间:2015-08-19 16:49:28

标签: ruby-on-rails single-table-inheritance

我有一个名为Coupons的模型 然后我有两个子模型CouponApplicationsApprovedCoupons。 最后两个通过STI架构从Coupons继承。

现在我想要实现以下目标:

  1. 用户看到CouponApplications
  2. 他点击了一个批准按钮,该按钮生成CouponApplications ApprovedCoupons
  3. 我意识到我只需更新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 记录而不是仅仅改变类型。

    有没有更好的方法?

1 个答案:

答案 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