【问题标题】:Rails STI - ignore concern when child record createdRails STI - 创建子记录时忽略关注
【发布时间】:2015-08-19 15:57:20
【问题描述】:

我的主要模特:

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

现在我有一个继承自优惠券模型的子模型“discounted_coupon.rb”:

class DiscountedCoupon < Coupon

end

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

我的目标:

如果我创建一个新的DiscountedCouponrecord,我想忽略关注“CouponDistribution”。

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

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

绘制错误:

# 的未定义方法“类型”

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

【问题讨论】:

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


    【解决方案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 
    

    【讨论】:

      【解决方案2】:

      你可以试试

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-06
        • 1970-01-01
        • 2015-01-23
        相关资源
        最近更新 更多