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 要求向我的主模型添加了一列 type
:http://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
我的主要模型:
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 要求向我的主模型添加了一列 type
:http://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