在apps / models / concerns / deactivable.rb
中module Deactivatable
extend ActiveSupport::Concern
included do
scope :alive, -> { where(:deactivated_at => nil) }
end
def deactivate(t = Time.current)
update_attribute(:deactivated_at,t)
end
def activate
update_attribute(:deactivated_at,nil)
end
def deactivated?
deactivated_at.present?
end
end
这包含在2个模型中,app / models / activity_rules / activity_detection_rule.rb和app / models / concerns / generic_campaign.rb。
还有另外两个模型包含具有不同属性名称的相同方法。
在redeemable.rb中,
class Redeemable < ActiveRecord::Base
scope :alive, -> { where("(deactivation_date is null) and (expiry_date is null or expiry_date >= ?)",Date.today) }
def deactivate(t = Time.current)
update_attribute(:deactivation_date,t)
end
def reactivate
update_attribute(:deactivation_date,nil)
end
def deactivated?
deactivation_date.present?
end
end
并在surprise_set.rb
scope :alive, -> { where("deactivation_date is null") }
使用与redeemable.rb相同的3种方法。
如何使用可停用的关注来干掉其他两个模型?
答案 0 :(得分:2)
您可以从类方法返回指示停用时间的属性。如果需要,您可以在关注中提供默认实现,并在包含关注的类中覆盖:
module Deactivatable
extend ActiveSupport::Concern
included do
scope :alive, -> { where(deactive_attr => nil) }
def self.deactive_attr
:deactivated_at
end
end
def deactivate(t = Time.current)
update_attribute(self.class.deactive_attr, t)
end
def activate
update_attribute(self.class.deactive_attr, nil)
end
def deactivated?
self.send(self.class.deactive_attr).present?
end
end
然后,在要提供不同属性的类中,可以添加类方法:
include Deactivatable
def self.deactive_attr
:deactivation_date
end
您还可以通过允许包含关注点的类来定义“活力”的条件来稍微干掉您的alive
范围。在此问题中,您可以定义默认
scope :alive, -> { where(self.active_conditions) }
def self.active_conditions
{ self.deactive_attr => nil }
end
然后,您可以在类本身中提供active_conditions
的不同实现:
self self.active_conditions
["(deactivation_date is null) and
(expiry_date is null or expiry_date >= ?)", Date.today]
end