Rails STI - 创建 child 记录时忽略问题

Rails STI - ignore concern when child record created

我的主要模型:

class Coupon < ActiveRecord::Base
  include Concerns::CouponDistribution
end

相关关注class:

module Concerns::CouponDistribution
  extend ActiveSupport::Concern

  included do
    after_create :create_coupons_for_existing_users
  end

  def create_coupons_for_existing_users
    #
  end

end

现在我有一个 child 模型 'discounted_coupon.rb' 继承自优惠券模型:

class DiscountedCoupon < Coupon

end

我已根据 STI 要求向我的主模型添加了一列 typehttp://api.rubyonrails.org/classes/ActiveRecord/Inheritance.html

我的目标:

如果我创建新的 DiscountedCoupon 记录,我想忽略问题 "CouponDistribution"。

所以我在关注中写了这个:

after_create :create_coupons_for_existing_users unless self.type == "DiscountedCoupon"

绘制错误:

undefined method `type' for #

还有其他方法可以实现我的目标吗?例如。明确 skip/ignore 我的 child 模型中的关注点?

可能有两种方法。一种是更简单的方法:

def create_coupons_for_existing_users
  return unless self.type == "DiscountedCoupon"
  # your logic here
end

另一个是这样的:

after_create : create_coupons_for_existing_users, unless: :discounted_coupon?

在您的模型中,您可以编写方法 discounted_coupon?

def discounted_coupon?
  self.type == "DiscountedCoupon"
end 

你可以试试

module Concerns::CouponDistribution
  extend ActiveSupport::Concern

  included do
    after_create :create_coupons_for_existing_users, if: Proc.new {|cd| cd.type == "DiscountedCoupon" }
  end

  def create_coupons_for_existing_users
    #
  end

end