Rails STI - 创建子记录时忽略关注

时间:2015-08-19 07:40:35

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

我的主要模特:

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

相关的关注类:

module Concerns::CouponDistribution
  extend ActiveSupport::Concern

  included do
    after_create :create_coupons_for_existing_users
  end

  def create_coupons_for_existing_users
    #
  end

end

现在我有一个儿童模特&#39; discounted_coupon.rb&#39;继承自优惠券模型:

class DiscountedCoupon < Coupon

end

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

我的目标:

我想忽略关注&#34; CouponDistribution&#34;如果我创建一个新的DiscountedCoupon记录。

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

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

绘制错误:

  

未定义的方法`类型&#39;对于#

有没有其他方法可以实现我的目标?例如。明确跳过/忽略我孩子模型中的关注点?

2 个答案:

答案 0 :(得分:1)

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

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 

答案 1 :(得分:1)

你可以尝试一下

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